数据结构中排序和查找各种时间复杂度
数据结构中排序和查找各种时间复杂度(1)冒泡排序
冒泡排序就是把小的元素往前调或者把大的元素往后调。比较是相邻的两个元素比较,交换也发生在这两个元素之间。所以相同元素的前后顺序并没有改变,所以冒泡排序是一种稳定排序算法。
(2)选择排序
选择排序是给每个位置选择当前元素最小的,比如给第一个位置选择最小的。…… 例子说明好多了。序列5 8 5 2 9, 我们知道第一遍选择第1个元素5会和2交换,那么原序列中2个5的相对前后顺序就被破坏了, 所以选择排序不稳定的排序算法
(3)插入排序
插入排序是在一个已经有序的小序列的基础上,一次插入一个元素。比较是从有序序列的末尾开始,也就是想要插入的元素和已经有序的最大者开始比起,如果比它大则直接插入在其后面,否则一直往前找直到找到它该插入的位置。如果和插入元素相等,那么插入元素把想插入的元素放在相等元素的后面。所以,相等元素的前后顺序没有改变。所以插入排序是稳定的。
(4)快速排序
快速排序有两个方向,左边的i下标一直往右走(往后),当a[i] <= a[center_index],其中center_index是中枢元素的数组下标,一般取为数组第0个元素。而右边的j下标一直往左走(往前),当a[j] > a[center_index]。如果i和j都走不动了,i <= j, 交换a[i]和a[j],重复上面的过程,直到i>j。 交换a[j]和a[center_index],完成一趟快速排序。在中枢元素和a[j]交换的时候,很有可能把前面的元素的稳定性打乱,比如序列为 5 3 3 4 3 8 9 10 11, 现在中枢元素5和3(第5个元素,下标从1开始计)交换就会把元素3的稳定性打乱,所以快速排序是一个不稳定的排序算法。(不稳定发生在中枢元素和a[j]交换的时刻)
(5)归并排序
归并排序是把序列递归地分成短序列,递归出口是短序列只有1个元素(认为直接有序)或者2个序列(1次比较和交换),然后把各个有序的段序列合并成一个有序的长序列。不断合并直到原序列全部排好序。相等时不发生交换。所以,归并排序也是稳定的排序算法。
(6)基数排序
基数排序是按照低位先排序,然后收集;再按照高位排序,然后再收集;依次类推,直到最高位。有时候有些属性是有优先级顺序的,先按低优先级排序,再按高优先级排序,最后的次序就是高优先级高的在前,高优先级相同的低优先级高的在前。基数排序基于分别排序,分别收集,所以其是稳定的排序算法。
(7)希尔排序(shell)
希尔排序是按照不同步长对元素进行插入排序,当刚开始元素很无序的时候,步长最大,所以插入排序的元素个数很少,速度很快;当元素基本有序了,步长很小,插入排序对于有序的序列效率很高。所以,希尔排序的时间复杂度会比o(n^2)好一些。由于多次插入排序,我们知道一次插入排序是稳定的,不会改变相同元素的相对顺序,但在不同的插入排序过程中,相同的元素可能在各自的插入排序中移动,最后其稳定性就会被打乱,所以shell排序是不稳定的。
(8)堆排序
我们知道堆的结构是节点i的孩子为2*i和2*i+1节点,大顶堆要求父节点大于等于其2个子节点,小顶堆要求父节点小于等于其2个子节点。在一个长为n的序列,堆排序的过程是从第n/2开始和其子节点共3个值选择最大(大顶堆)或者最小(小顶堆),这3个元素之间的选择当然不会破坏稳定性。但当为n/2-1, n/2-2, ...1这些个父节点选择元素时,就会破坏稳定性。有可能第n/2个父节点交换把后面一个元素交换过去了,而第n/2-1个父节点把后面一个相同的元素没有交换,那么这2个相同的元素之间的稳定性就被破坏了。所以,堆排序是不稳定的排序算法
一、排序
排序法 平均时间 最差情形 稳定度 额外空间 备注
冒泡 O(n2) O(n2) 稳定 O(1) n小时较好
交换 O(n2) O(n2) 不稳定 O(1) n小时较好
选择 O(n2) O(n2) 不稳定 O(1) n小时较好
插入 O(n2) O(n2) 稳定 O(1) 大部分已排序时较好
Shell O(nlogn) O(ns) 1<s<2 不稳定???="" o(1)???????="" s是所选分组</s
快速 O(nlogn) O(n2) 不稳定 O(nlogn) n大时较好
归并 O(nlogn) O(nlogn) 稳定 O(1) n大时较好
堆 O(nlogn) O(nlogn) 不稳定 O(1) n大时较好
基数 O(logRB) O(logRB) 稳定 O(n) B是真数(0-9),R是基数(个十百)
二、查找
未写……
三 树图
克鲁斯卡尔算法的时间复杂度为O(eloge)
普里姆算法的时间复杂度为O(n2)
迪杰斯特拉算法的时间复杂度为O(n2)
拓扑排序算法的时间复杂度为O(n+e)
关键路径算法的时间复杂度为O(n+e)
绛旓細鍦鏁版嵁缁撴瀯鐨勪笘鐣岄噷锛岀畻娉曟晥鐜囩殑琛¢噺骞堕潪瀛ょ珛浜鏃堕棿澶鏉傚害锛岀┖闂村鏉傚害鍚屾牱涓捐冻杞婚噸銆傝鎴戜滑涓璧锋帰璁ㄨ繖涓や釜鍏抽敭鎸囨爣锛屽畠浠浣曞奖鍝嶆垜浠殑浠g爜鏁堢巼鍜岃绠楁満璧勬簮绠$悊銆傛椂闂村鏉傚害锛屼互閫掑綊鏂愭尝閭e鏁板垪涓轰緥锛屽叾O(2^N)鐨勮〃杩版彮绀轰簡闂瑙勬ā涓庤繍琛屾椂闂寸殑绱у瘑鍏宠仈銆備絾闅忕潃鎶鏈殑杩涙锛岀幇浠h绠楁満鏇村惧悜浜庤拷姹傛椂闂存晥...
绛旓細椤哄簭琛鏌ユ壘绠楁硶 鏃堕棿澶鏉傚害:O(N) 鐗圭偣:浼樼偣,鐞嗚В绠鍗,浠g爜鍐欒捣鏉ヤ篃绠鍗;缂虹偣,鏁堢巼浣庛 鍒╃敤涓嬫爣閬嶅巻鏁扮粍(鎴栧叾浠鏁版嵁缁撴瀯)鍗冲彲,杈冪畝鍗曘傞『搴忔煡鎵捐〃绠楁硶-浼樺寲鐗 鏃堕棿澶嶆潅搴:O(N) 鐗圭偣:涓庝笂涓涓竴鏍枫 涓昏灏辨槸鍦ㄩ亶鍘嗘椂鍔犱笂涓涓竟鐣屾潯浠,涔嬪墠鐨勭増鏈瘡娆″姞1浠ュ悗閮借杩涜鍒ゆ柇鏄惁瓒婄晫,鐒跺悗鍐嶅垽鏂槸鍚...
绛旓細绋嬪簭鎵鐢ㄦ椂闂村叧浜庢暟鎹妯$殑鍑芥暟 姣斿锛氱粰n涓暟鎺掑簭闇瑕乶^2鐨勬椂闂 鏃堕棿澶鏉傚害灏辨槸O锛坣^2锛夐氬父鏈 O(2)甯告暟 涓庤緭鍏ユ暟鎹妯℃棤鍏 O(n)鎴愭姣 O(log2n)骞虫柟涓庢暟鎹瑙勬ā鎴愭姣 O(n^2)涓庢暟鎹妯$殑骞虫柟鎴愭姣 O(n^3)鈥︹︿笁娆℃柟鈥︹(n!)闃朵箻 ...
绛旓細鎺掑簭绠楁硶鍖呮嫭锛氭彃鍏ユ帓搴忋佷氦鎹㈡帓搴忋侀夋嫨鎺掑簭浠ュ強鍚堝苟鎺掑簭銆傚叾涓彃鍏ユ帓搴忓寘鎷洿鎺ユ彃鍏鎺掑簭鍜Shell鎺掑簭锛屼氦鎹㈡帓搴忓寘鎷啋娉℃帓搴忓拰鍒嗗寲浜ゆ崲鎺掑簭锛岄夋嫨鎺掑簭鍖呮嫭鐩存帴閫夋嫨鎺掑簭鍜屽爢鎺掑簭銆傝繖浜涙帓搴忕畻娉曚腑锛岀洿鎺ユ彃鍏ユ帓搴忋佸啋娉℃帓搴忓拰鐩存帴閫夋嫨鎺掑簭杩欎笁绉嶆帓搴忕殑绠楁硶骞冲潎鏃堕棿澶鏉傚害鏄疧(n鐨勫钩鏂)锛涘垎鍖栦氦鎹㈡帓搴忋佸爢鎺掑簭鍜屽悎骞舵帓...
绛旓細甯屽皵鎺掑簭锛氬笇灏旀帓搴忓張绉扮缉灏忓閲忔帓搴忥紝澧為噺di鍙互鏈鍚勭涓嶅悓鐨勫彇娉曪紝浣嗘渶鍚庝竴娆℃帓搴忔椂鐨勫閲忓繀椤讳负1锛屾渶绠鍗曞彲鍙杁i+1=di/2锛堝彇灏忥級銆鏃堕棿澶鏉傚害涓篛(n(log2n)2)銆傜洿鎺ラ夋嫨鎺掑簭 璇存槑锛氭瘡娆″皢鍚庨潰鐨勬渶灏忕殑鎵惧嚭鏉ユ彃鍏ュ墠闈㈢殑宸叉帓濂界殑搴忎腑銆傚悓鐞嗭紝鍏锋湁n涓褰曠殑搴忓垪瑕佸仛n-1娆℃帓搴忋傛椂闂村鏉傚害涓篛(...
绛旓細鍫鎺掑簭鐨鏃堕棿澶鏉傚害涓猴細O 浠ヤ笅鏄 鍫嗘帓搴忔槸涓绉嶅熀浜庢瘮杈冪殑鎺掑簭绠楁硶銆傚畠鍒╃敤鍫嗚繖绉鏁版嵁缁撴瀯鎵璁捐鐨勬帓搴忕畻娉曪紝鑳藉鍦ㄦ渶鍧忋佸钩鍧囧拰鏈濂芥儏鍐典笅閮借揪鍒版椂闂村鏉傚害O銆傝繖鏄洜涓哄爢鎺掑簭鐨勬湰璐ㄦ槸鏋勫缓鏈澶у爢鎴栨渶灏忓爢锛岀劧鍚庨氳繃涓嶆柇绉婚櫎鍫嗛《鍏冪礌骞堕噸鏂拌皟鏁村爢鏉ュ疄鐜版帓搴忋傚叿浣撴楠ゅ涓嬶細1. 鏋勫缓鍒濆鍫嗭級锛氫粠绗竴...
绛旓細妗堜緥2锛氬父鏁版鎿嶄綔鐨勭畻娉曪紝鏃堕棿澶鏉傚害O(1)锛屼唬琛ㄦ棤璁鸿緭鍏ヨ妯″澶э紝鎵ц鏃堕棿淇濇寔涓嶅彉銆 妗堜緥3锛歴trchr鍑芥暟鏈鍧忔儏鍐典笅鐨勬椂闂村鏉傚害鏄疧(1)锛岃〃鏄鏌ユ壘鏁堢巼涓嶅彈杈撳叆瑙勬ā褰卞搷銆 妗堜緥4锛氬啋娉鎺掑簭锛屾渶濂芥儏鍐典笅O(N)锛屾渶鍧廜(N^2)锛岃〃鏄庢帓搴忔晥鐜囧彈杈撳叆鏈夊簭绋嬪害褰卞搷銆 妗堜緥5锛氫簩鍒嗘煡鎵撅紝鏁堢巼鏋佷匠锛屾渶...
绛旓細鏁版嵁缁撴瀯涓鐨鎺掑簭涓浜屽弶鏍戞湁鐫瀵嗗垏鑱旂郴銆傚綊骞舵帓搴忥紝鏈川涓婃槸鍚庡簭閬嶅巻鐨勯掑綊绠楁硶锛岄氳繃閬嶅巻涓涓簩鍙夋爲锛屾寜鐓ц妭鐐逛綅缃墽琛岀浉搴旀搷浣溿傚綊骞舵帓搴忕殑鏍稿績鍦ㄤ簬鍚堝苟涓や釜宸叉帓搴忕殑瀛愭暟缁勶紝鏃堕棿澶鏉傚害涓篛(NlogN)锛岀┖闂村鏉傚害涓篛(N)銆傚畠閫氳繃褰掑苟鎿嶄綔鍚堝苟鏁扮粍锛岀‘淇濆厓绱犳寜搴忔帓鍒椼傚揩閫熸帓搴忓垯鏄墠搴忛亶鍘嗙殑浣撶幇锛岄氳繃灏...
绛旓細甯屽皵鎺掑簭锛氭彃鍏ユ帓搴忕殑浼樺寲鐗堬紝鏁堢巼鏇撮珮锛屼絾涓嶄繚璇佺ǔ瀹氥傚綊骞舵帓搴忥細鍒嗘不绛栫暐鐨勪唬琛紝閫傜敤浜庡ぇ閲忔暟鎹紝浣嗗彲鑳介渶瑕侀澶栧唴瀛樸傚揩閫熸帓搴忥細Tony Hall鐨勬澃浣滐紝骞冲潎鏁堢巼楂橈紝浣嗘渶鍧忔儏鍐典笅鏃堕棿澶鏉傚害涓篛(n²)銆傚爢鎺掑簭锛氬埄鐢ㄥ爢鏁版嵁缁撴瀯锛屼竴绉嶉珮鏁堢殑閫夋嫨鎬ф帓搴忋傞潪姣旇緝鎺掑簭绠楁硶锛屽璁℃暟鎺掑簭銆佹《鎺掑簭鍜鍩烘暟鎺掑簭锛...
绛旓細鍚 2n 涓暟鎹瓨鍌ㄥ湪灏忛《鍫嗕腑銆傝繖鏍凤紝澶ч《鍫嗕腑鐨勫爢椤跺厓绱犲氨鏄垜浠鎵剧殑涓綅鏁般傚鏋 n 鏄鏁帮紝鎯呭喌鏄被浼肩殑锛屽ぇ椤跺爢灏卞瓨鍌 2n+1 涓暟鎹紝灏忛《鍫嗕腑灏卞瓨鍌 2n 涓暟鎹傛瀬瀹鏃堕棿--鏁版嵁缁撴瀯涓绠楁硶涔嬬編--28 | 鍫嗗拰鍫鎺掑簭锛氫负浠涔堣鍫嗘帓搴忔病鏈夊揩閫熸帓搴忓揩锛