先po一張網上的圖:
1.空間複雜度:
o(1): 插入排序、選擇排序、氣泡排序、堆排序、希爾排序
o(logn)~o(n): 快速排序
o(n): 歸併排序(通過手搖演算法可以優化到o(1) ,但是時間複雜度會上公升 )
o(m): 計數排序,基數排序 (m:桶的個數)
2.穩定性:
不穩定: 選擇排序、堆排序、快速排序、希爾排序(快些來選一堆美女)
穩定: 插入排序、氣泡排序、歸併排序、計數排序、基數排序
將相鄰兩個數兩兩進行比較,把大的逐漸交換到最後的位置,比較次數為n(n-1)/2。
int* bubblesort(int* a, int n) }}
returna;
}
從序列中選出最小值放與最左端的數交換,再從剩下的序列中選出最小值與第二個數交換,依次進行直至有序。
int* selectionsort(int* a, int n)
}if(min!=i)
}return a;
}
特徵分析:
1、空間複雜度o(1),最好/最壞/平均時間複雜度都是o(n^2),比較次數o(n^2),移動次數o(n)。
2、選擇排序是不穩定的排序方法
三、插入排序:
從序列最右端
知識點:
1.對基本有序的數列進行排序,最好的是堆排,最壞的是快速排序。
2.快速排序中,key的值選的越接近**,即左右子串行的長度越接近,處理速度越快。
3.排序時,若不採用計數排序等科技換時間的方法,合併m個長度為n的已排序陣列的時間複雜度最優為:o(mnlog(m))。
思想是:先將每個陣列的第乙個數提取出來,建立乙個小根堆,時間複雜度o(m);然後每次輸出堆頂的數,再將其所屬已排序陣列的後乙個數放入堆頂,調節小根堆。因為我們有m*n個數,小根堆調整時間為o(logm),所以時間複雜度o(nmlogm)。
4.堆排序無論初始狀態如何都是o(nlogn);
選擇排序無論初始狀態如何都是o(n2);
歸併排序無論初始狀態如何都是o(nlogn);
快速排序若初始數列有序則達到最壞程度o(n2);
氣泡排序若初始狀態正序,則只需n-1次比較,一趟排序,無需移動元素,此時達到o(n);
插入排序若初始狀態有序則達到最好狀態o(n),若初始狀態無序,則達到最壞狀態o(n2);
5.歸併排序演算法在輸入資料逆序情況下排序速度最快。
6.比較次數與序列初始狀態無關的排序方法:
簡單選擇排序
二分插入排序
7.除了堆排序演算法的比較次數是o(nlog2 n),其他的都是n(n-1)/2
排序演算法總結
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 的演算法。快速排序 快速排序是乙個就地排序,分而治之,大規模遞迴的演算法。從本質上來...