(四)快速排序
实现代码:
这里实现了两个版本
/*!
* 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
10 | 0.30187 |
20 | 0.60374 |
50 | 2.11309 |
100 | 4.226179 |
200 | 8.452358 |
500 | 22.33838 |
1000 | 47.69545 |
2000 | 99.91895 |
3000 | 196.8192 |
4000 | 213.422 |
5000 | 265.9474 |
6000 | 328.7364 |
7000 | 384.2804 |
8000 | 442.2395 |
9000 | 497.4817 |
10000 | 575.666 |
20000 | 1183.632 |
50000 | 3784.241 |
100000 | 6740.454 |
200000 | 15107.68 |
500000 | 42416.65 |
800000 | 63804.13 |
1000000 | 80738.13 |