9種常見內部排序演算法的效能比較

2021-06-27 01:17:35 字數 2077 閱讀 9425

在寫完這9種常見的內部排序演算法後總覺得需要把它們拿出來好好比較一番,看看各個演算法的效能優劣。

我們先來看看這九種排序演算法的時間複雜度、空間複雜度和穩定性:

看完了各個排序演算法的理論效能後,再來看一看在實踐上的效能。

在程式裡,隨機數的範圍為0~49999999;進行10次外迴圈,每一趟外迴圈裡生成乙個隨機數組,陣列的大小逐趟遞增();在內迴圈裡利用各個排序演算法的函式對外迴圈裡生成的陣列進行排序,內迴圈執行15趟,然後記錄下每一趟裡每個演算法所花費的時間,算出這15趟的平均花費的時間(ms)。

最後執行程式,得出以下的結果:

其中,qsort:c函式庫自帶的排序函式qsort;

quicksort:自己實現的快速排序;

countsort:自己實現的計數排序(沒有考慮空間利用率和負數的版本);

heapsort:自己實現的堆排序;

shellsort:自己實現的希爾排序;

mergesort:自己實現的二路歸併排序;

radixsort:自己實現的鏈式基數排序;

insertsort2:優化後的插入排序;

selectsort:自己實現的選擇排序;

bubblesort2:自己實現的經過簡單優化的氣泡排序。

由於冒泡、插入和選擇排序在待排序元素數量增長的情況下呈平方關係增長,所以當待排序元素個數大於1000000後就去除了這三種排序演算法的比較了。

很不幸,在陣列大小為500000000的時候,程式被無情的kill了,估計是計數排序消耗太多的記憶體了。

從以上結果可以看出隨著待排序元素個數的增加,各個 排序演算法所花費的時間也隨之增加,但是各個演算法在時間增加的幅度上卻有著不小的差別:

由於,此次實驗中都是用c語言自帶的隨機數產生器,所以基本上可以認為產生的陣列是隨機的,進而可以知道此次比較主要是針對各個排序演算法在平均情況下的時間效能。

首先來看看第一張的那三個平均時間複雜度o(n2)的排序演算法(氣泡排序、插入排序和選擇排序),可以從第一張中看出當陣列大小從50000增長到100000時(大小變為原來的2倍),排序所花費的時間變為原來的4倍(大約);但陣列大小從50000增長到500000時(大小變為原來的10倍),排序所花費的時間變為原來的100倍!大小和時間的關係基本上是平方關係。

我們再來看看,那三個平均時間複雜度為o(nlgn)的排序演算法(快速排序、歸併排序和堆排序),其中對於快速排序和堆排序,當陣列從10000000增長到100000000(大小便為原來的10倍),排序所花費的時間變為原來的15倍到16倍(大約);當陣列從1000000增長到10000000時(大小變為原來的10倍),排序所花費的時間變為原來的15倍到16倍(大約);大小和時間的關係基本上是(1/2)n*lgn的關係。對於歸併排序,當陣列大小從1000000增長到10000000時(大小變為原來的10倍),排序所花費的時間變為原來的11.7倍;當陣列大小從10000000增長到100000000時(大小變為原來的10倍),排序所花費的時間變為原來的11.2倍;大小和時間的關係基本上是(1/3)n*lgn的關係。

最後我們來看看,那兩個平均時間複雜度為常數時間的演算法(基數排序和計數排序),其中對於基數排序,排序時間的增長倍數和陣列大小增長倍數基本相當,滿足線性關係;對於計數排序,剛開始排序時間的增長比陣列大小的增長要來的小一些,但是當陣列大小增長到10000000以後排序時間的增長倍數和陣列大小的增長倍數基本相當,滿足線性關係。

我的測試方法可能會有一定的侷限性,但是也能從這次測試中看出各個排序演算法的實際效能了。

還有就是,原本是想用-o3的編譯優化選項,可是用這種方法生成的檔案在執行時會丟擲異常,導致程式終止,現在還不知是什麼原因.......

下面是我的電腦的基本配置資訊:

電腦的基本配置

五種內部排序演算法效能比較 C

五種內部排序演算法效能比較 1.直接插入排序演算法 將乙個待排序的記錄插入到若干個已排好序的有序記錄中的適當位置,從而得到乙個新的 記錄數增加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 ...