您的位置:首页 > 其它

9种排序算法性能之比较之----快速排序

2014-10-29 22:26 309 查看

(四)快速排序

实现代码:

这里实现了两个版本

/*!

*  from wiki

*/

void quick_sort1 (int data[], size_t left,size_t right)

{

size_t p = (left + right) / 2;

int pivot = data[p];

size_t i = left,j = right;

for ( ; i < j;) {

while (! (i>= p || pivot < data[i]))

++i;

if (i < p) {

data[p] = data[i];

p = i;

}

while (! (j <= p || data[j] < pivot))

--j;

if (j > p) {

data[p] = data[j];

p = j;

}

}

data[p] = pivot;

if (p - left > 1)

quick_sort1 (data, left, p - 1);

if (right - p > 1)

quick_sort1 (data, p + 1, right);

}

/*!

* implemented by mengzhaofeng, 正序或者逆序时性能很差O(n^2),数据分布比较随机时情况较好,受样本分布影响比较大,不稳定

*/

void quick_sort2(int *data, int first, int last)

{

int i = first, j = last-1, k = last;

int base = data[last];

while(i <= j) {

while(data[i] <= base && i < k) i++;

if(i < k) {

data[k] = data[i];

k = i;

i++;

}

while(data[j] >= base && j > k) j--;

if(j > k) {

data[k] = data[j];

k = j;

j--;

}

}

data[k] = base;

if(k > first+1) quick_sort2(data, first, k-1);

if(k < last-1) quick_sort2(data, k+1, last);

}

/*!

* 快速排序

*/

double QuickSort(int *data, int size)

{

double res = 0;

//EClock<> Ek;

quick_sort2(data, 0, size-1);

//res = Ek.microsecond();

return res;

}

测试结果:

                单位:us

100.30187
200.60374
502.11309
1004.226179
2008.452358
50022.33838
100047.69545
200099.91895
3000196.8192
4000213.422
5000265.9474
6000328.7364
7000384.2804
8000442.2395
9000497.4817
10000575.666
200001183.632
500003784.241
1000006740.454
20000015107.68
50000042416.65
80000063804.13
100000080738.13
变化趋势:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐