排序中用到最多的應該是quicksort了。
以下會使用兩個純c版本的快排。
快排的時間複雜度低,並且不占用額外空間。但是會改變原來的資料順序。
第乙個是使用stdlib.h中的sqrt()
#include int comp(const void *a, const void *b)
void qsort_test()
; qsort(b, 7, sizeof(b[0]), comp);
for (int i=0; i<7; i++)
}
執行結果如下
但是有的時候我們只需要求某乙個元素,比如求中位數,第二大的元素,倒數第二小的元素......
如果全排序會比較浪費時間。
沒關係,這裡有第二個方法,利用快排做遞迴,當已經求出目標次序的元素就終止排序。
quicksort() 遞迴排序求特定次序的元素。
//排序求第n個數
ushort quicksort(ushort *a,uchar low,uchar high,uchar ordernum)
a[i]=pivotkey;
if(i==ordernum) return a[i];
else if(i執行結果如下
下面,我對這兩種方法在 求特定次序元素時的效率作了測試:
快速排序會對序列的次序有一定關係。我就簡單的使用一種亂序序列作反覆測試。略有點不嚴謹哦~~
但快速排序會改變原資料的次序,我將使用每次拷貝的方式。
不多說,上**:
void quicksort_test()
; uint16 b[7]=;
clock_t start,end;
start=clock();
for (int i=0; i以下是執行結果
在同樣做資料拷貝的情況下,qsort() 和 quicksort()都對序列作了10000000次的排序,
可見若求特定次序的元素,quicksort()是更好的選擇。
如果網友覺得有明顯不嚴謹的地方,歡迎拍磚。
快速排序的JAVA實現和效能分析
package sort 快速排序是不穩定的排序。快速排序的時間複雜度為o nlogn 當n較大時使用快排比較好,當序列基本有序時用快排反而不好。public class quicksort system.out.println 排序之前 for int i 0 i a.length i 快速排序 ...
快速排序的C 實現和分析
快速排序 每一輪找到乙個關鍵資料 然後比他所有小的都放左邊,比他大的都放右邊,這樣兩邊走過一趟稱為一趟快速排序,然後從 中間分開,左右兩邊再進行一次迴圈 直到完全排序成功 需要利用遞迴完成。一趟快速排序的演算法是 1.設定乙個定值,一般為陣列的第乙個數字,然後設定兩個變數i,j分別指向開頭末尾,用來...
氣泡排序 希爾排序 歸併排序 快速排序效能分析
本 用來測量分析氣泡排序 希爾排序 歸併排序 和快速排序在陣列大小不同的情況下的用時情況。使用函式比較兩個陣列是否一致 bool check int s,int s2,int len s k gap temp 歸併排序 void gsort int s,int l,int r for int t 0...