最近因為找實習的緣故,開始苦心研究演算法了。這次就總結下排序演算法吧。
最簡單的就是插入排序和氣泡排序,插入排序就是將第n個數插入到前n-1個有序的子列中,不斷迴圈完成排序;氣泡排序不斷地兩兩比較,把大的數往後移動,類似於乙個網上躥的氣泡一樣。氣泡排序時間複雜度是o(n2),插入排序因為可以用折半查詢的方式,所以時間複雜度為o(nlogn),這兩種演算法的空間複雜度都為o(1)。快速排序對於小資料量時效能優秀,氣泡排序可以加入乙個標誌flag,如果某一輪比較沒有移動,那麼就可以結束演算法,對演算法的時間複雜度有線性的優化。
歸併排序的思想是將兩個有序的子列合成乙個完成排序,實際操作就是遞迴地把陣列分成兩段,直到某乙個子列由兩個長度為1的子列組成,這兩個子列必然是有序的,這時開始合併子列。合併的方式用兩個指標指向兩個子列的頭,然後比較,小的元素移動到一塊新開闢的記憶體中,這樣一次的時間複雜度是o(n),總共進行logn次,所以時間複雜度是o(nlogn),空間複雜度為o(n)。該演算法的缺陷就是需要額外的儲存空間,為了節省額外的儲存空間,所以就有了快速排序。
快速排序的思想是選定乙個支點將原陣列分為兩個子列,其中左邊的子列都小於該支點,右邊的子列都大於該支點,然後對子列也進行這樣的操作,最終就對陣列完成排序了,支點的選擇一般可以考慮第乙個元素,或者是隨機選擇某個元素,最理想的情況是每次選擇的支點都是陣列的中值,那麼這樣的話時間複雜度就是o(nlogn)。但也有可能是最壞的情況也就是每次選擇的支點都是最大或者最小的數,那麼時間複雜度就是o(n2),所以在優化上考慮將陣列打亂或者是掃一遍陣列看陣列是否有序,這樣可以避免最壞的情況。
另外還有幾種線性時間的排序演算法,但都對輸入陣列有要求,例如桶排序,要求輸入陣列必須是均勻分布的,例如n個整數排序,大小分別為1...n,那麼只用掃瞄一遍陣列就可以完成排序。其思想是將[1,n]劃分成n個子區間,或者是桶,然後將n個輸入數分布到各自各個桶中,只要把每個資料放到對應的桶中就可以完成排序。例如乙個int陣列第乙個數是5,那麼就放到第5個桶,即a[4]中。
排序演算法總結
1 直接插入排序 1 穩定性 穩定 2 適用情況 待排記錄規模較小,或者記錄已經基本有序 2 希爾排序 1 穩定性 不穩定 2 特點 希爾排序的執行時間依賴於增量序列,它的效率比直接插入排序有較大的改進。3 氣泡排序 1 穩定性 穩定 2 特點 當待排記錄基本有序是,氣泡排序是不錯的選擇 但由於氣泡...
排序演算法總結
1 選擇排序 選擇排序的思想是依次從待排序數列中選擇最大 小 的 第二大 小 的等等,然後依次重新排列為有序數列。void selectionsort int a,int n if min i 時間複雜度o n 2 2 歸併排序 void merge int a,int left,int mid,i...
排序演算法總結
學習了這麼多的排序演算法,還沒有做個總結,呵呵 氣泡排序 氣泡排序是最慢的排序演算法。在實際運用中它是效率最低的演算法。它通過一趟又一趟地比較陣列中的每乙個元素,使較大的資料下沉,較小的資料上公升。它是 o n 2 的演算法。快速排序 快速排序是乙個就地排序,分而治之,大規模遞迴的演算法。從本質上來...