執行結果如下圖(單位ms)
insert:只排了8萬及以下資料
heap:參考演算法導論,maxheapify採用迭代取代遞迴
shell:增量遞減序列採用1/2
(3k−
1)1/2(3^k-1)
1/2(3k
−1)形式
shell-is:incerpi-sedgewick提出的增量遞減序列
[ 1391376, 463792, 198768, 86961, 33936, 13776,
4592, 1968, 861, 336, 112, 48, 21, 7, 3, 1]
hybridquick:pivot為三取中的快排,在遞迴到少量資料(小於等於16)時採用插入排序直接排序
quick:pivot為三取中的快排
qsort:c庫的排序方法,qsort內部實現好像也是採用快排 完整**如下
#include #include #include #include #include #include #include #define cmp(a, b) (a < b)
#define maxn 200000000
#define threshold 16
typedef long itemtype;
int cmp_proc(const void* a,const void* b);
void randarray(itemtype a, int n);
void copyarray(itemtype a, itemtype b, int n);
void call_qsort(itemtype a, int l, int r);
int partition(itemtype a,int l,int r);
void quicksort(itemtype a,int l,int r);
void hybridquicksort(itemtype a,int l,int r);
void shellsort(itemtype a,int l,int r);
void shellsortis(itemtype a, int l, int r);
void insertsort(itemtype a,int l,int r);
void maxheapify(itemtype a,int l,int r,int i);
void buildmaxheap(itemtype a,int l,int r);
void heapsort(itemtype a,int l,int r);
/**************/
long doit(void (*sortprog)(), itemtype a, int l, int r)
/**************/
int main();
// heapsort(a,0,13);
// for(int i=0;i<14;i++)
// printf("%ld\t",a[i]);
int n;
int c1=0, c2=0, c3=0, c4=0, c5=0, c6=0,c7=0;
a =(itemtype*)malloc(maxn*sizeof(itemtype));
b =(itemtype*)malloc(maxn*sizeof(itemtype));
printf(" n insert heap shell shellis hybridquick quick qsort \n");
//printf(" n 1 2 3 4 5 6 7 \n");
for (n = 10000; n <= maxn; n *= 2)
else
c1=0;
copyarray(a, b, n); c2 = doit(heapsort, a, 0, n-1);
copyarray(a, b, n); c3 = doit(shellsort, a, 0, n-1);
copyarray(a, b, n); c4 = doit(shellsortis, a, 0, n-1);
copyarray(a, b, n); c5 = doit(hybridquicksort, a, 0, n-1);
copyarray(a, b, n); c6 = doit(quicksort, a, 0, n-1);
copyarray(a, b, n); c7 = doit(call_qsort, a, 0, n-1);
printf("%10d %10d %10d %10d %10d %10d %10d %10d\n", n, c1, c2, c3, c4, c5, c6,c7);
}return 0;
}void randarray(itemtype a, int n)
void copyarray(itemtype a, itemtype b, int n)
}int cmp_proc(const void* a,const void* b)
void call_qsort(itemtype a, int l, int r)
void insertsort(itemtype a,int l,int r)
a[j+1]=key;
}}void shellsortis(itemtype a, int l, int r);
int i, j, k, h, t; itemtype v;
for ( k = 0; k < 16; k++)
for (h = incs[k], i = l+h; i <= r; i++)
a[j] = v;
} }int partition(itemtype a,int l,int r)
for(;k<20;k++)
a[j+h]=key;
}}
}void maxheapify(itemtype a,int l,int r,int i)
}void buildmaxheap(itemtype a,int l,int r)
void heapsort(itemtype a,int l,int r)
}
幾種排序演算法執行時間比較
最近無聊,把各種排序演算法在linux下用c實現了,並記錄其執行時間如下 對10m個無符號隨機整數進行排序,各種演算法的時間如下 qsort c標準庫自帶函式 real 0m5.901s user 0m5.548s sys 0m0.300s merge sort real 0m5.757s user...
python 幾種快速排序的實現以及執行時間比較
快速排序的基本思想 首先選定乙個陣列中的乙個初始值,將陣列中比該值小的放在左邊,比該值大的放在右邊,然後分別對左邊的陣列進行如上的操作,對右邊的陣列進行如上的操作。分治 遞迴 1.利用匿名函式lambda 匿名函式的基本用法func name lambda x array,冒號左邊的x代表傳入的引數...
python 幾種快速排序的實現以及執行時間比較
快速排序的基本思想 首先選定乙個陣列中的乙個初始值,將陣列中比該值小的放在左邊,比該值大的放在右邊,然後分別對左邊的陣列進行如上的操作,對右邊的陣列進行如上的操作。分治 遞迴 1.利用匿名函式lambda 匿名函式的基本用法func name lambda x array,冒號左邊的x代表傳入的引數...