一:排序演算法複雜度
排序演算法
最壞情況效能
平均效能
氣泡排序 n2
n2計數排序
n2 n2
插入排序
n2 n2
選擇排序
n2 n2
堆排序nlog(n)
nlog(n)
歸併排序
nlog(n)
nlog(n)
快速排序
n2
nlog(n)
二、三值取中快排
由於快排對有序的輸入序列比對無序輸入序列要慢,為了解決這個問題,提高快排的平均效能,提出三值取中規則選擇支點元素。方法是對序列的最左頭元素、中間元素、最右頭元素取三者的中值元素作為支點元素。比如三元素分別為5、9、7,則取7為支點元素;
使用三值取中規則對輸入有序的表進行快速排序,用時為o(nlog(n))。並且不會出現乙個資料段為空的情況(當快排左右兩塊大小差不多時效能最好),使用三值取中就可以保證左右兩個資料段長度均衡
三、結合兩種效能好的排序演算法
實驗發現當排序的數量小於某值時,插入排序效能最好,大於某值,快速排序效能最好;所以可以設定某值c結合著這兩種演算法.
四、c++中的排序方法
sort:使用改進的快排,當子串行(已經經過了分治)的數量超過對數的某個常數倍時,使用堆排序,資料段不大時,使用過插入排序;
stable_sort:是歸併排序,當資料段不大時,使用插入排序。
五、效能最優排序演算法(18章課後題28)
發現:1,在1000以上,快排的效果就顯示出來了,幾百的時候插入排序就很快;2,隨著總數的上公升nbreak不能太小,在總數0.1倍的時候效果還可以,再小就越來越差。
(注:生成資料隨機,帶/的後面是stl的sort方法的執行時間,沒有的表示sort執行時間為0,每組試驗資料多次取平均):
總數
1000
5000
50000
nbreak=100
0.001
太慢
nbreak=500
0有時比sort好
0.017
nbreak=1000
0~0.001
0.012
nbreak=2000
0.008/0.001
nbreak=2500
0.010
/0.001
45.513/0.005
nbreak=5000
0.017
1.111/0.006
nbreak=10000
0.636/0.004
nbreak=20000
0.646/0.004
nbreak=25000
0.956/0.006
nbreak=50000
1.373/0.01
//書chp18 題28
#include
#include
#include
#include
#include
using namespace std;
//void insertsort(int b, int leftend, int rightend);
void mysort(int b, int leftend, int rightend);
int main()
void mysort(int b, int leftend, int rightend) ;
if (snum>nbreak) //使用快排
if (a[1] > a[2])
} //取中間元素作為支點
int mid = b[(leftend + rightend) / 2];
mysort(b, 0, (leftend + rightend) / 2 - 1);
mysort(b, (leftend + rightend) / 2 + 1, rightend); }
else //使用插入排序
} }
等看了二叉樹後,補上堆排序。
資料結構之排序的效能比較
一 前言 本文總結排序中的內部排序。內部排序是指待排序列完全存放在記憶體中所進行的排序過程,適合不太大的元素序列。二 正文 對於內排序來說,排序演算法的效能主要是受3個方面影響 1 時間效能 排序是資料處理中經常執行的一種操作,往往屬於系統的核心部分,因此排序演算法的時間開銷是衡量其好壞的最重要的標...
《面試之排序演算法效能比較》
效能穩定 平均時間複雜度為 o nlogn 最好時間複雜度為 o nlogn 最壞時間複雜度為 o nlogn 核心思想 1 分 只要可以分,就可以將list中的元素分成兩半,直到不能分則跳出 2 比 對於傳入兩個list,則要比較排序,則為了提高效率,輸入為有序list,3 合 對於輸入兩個有序的...
各種內排序演算法效能比較
各種內排序演算法效能比較 個人總結 穩定性最好情況 最壞情況 平均空間複雜度 確定最終位置 簡單選擇排序 屬於選擇排序 不穩定o n n 1趟 o n n 1趟 o n n 1趟 o 1 一趟排序後能確定某個元素的最終位置 直接插入排序 穩定o n n 1趟 o n n 1趟 反向有序 o n n ...