|
先上代码
void __quick_sort(int *p, int left, int right) {
int pivot, pivot_index = left, i;
swap(p, (left + right) / 2, right);
pivot = p[right];
for (i = left; i < right; i++) {
if (p[i] >= pivot) {
swap(p, i, pivot_index);
pivot_index++;
}
}
swap(p, pivot_index, right);
if (left < pivot_index - 1)
__quick_sort(p, left, pivot_index - 1);
if (right > pivot_index + 1)
__quick_sort(p, pivot_index + 1, right);
}
照着wikipedia上的pseudocode写的,测试通过,不过速度慢得很。 |
|
|
都是用release版本测试的吗?
|
|
|
先
http://www.microsoft.com/visualstudio/chs/downloads#d-2010-express 点开Visual C++ 2010 Express下面的语言选‘简体中文’,再点立即安装 再参考C:\Program Files\Microsoft Visual Studio 10.0\VC\crt\src\qsort.c |
|
| 10分 |
交换太多
字数补丁 |
| 20分 |
没看出来这个是快排,感觉你这个复杂度为O(n^2)
因为你一个for,再加了一个递归 感觉像是变形的冒泡~~~~ 堆排序复杂度是lgn*n 你这个方法说的不好听的 比2个for还烂 如果设计到数据查找的话, 最好还是用红黑树 每次插入最多做3次旋转即可,当然你这种已经存在大批量的数据的画,最快的还是快排 |
| 10分 |
应该是数据分布不佳所致,一般数组小到一个程度转成插入排序,递归过深转为堆排,不要全程都是快排…
|
|
for那里。。。是从left到right遍历一次,相当于每次递归,你都要遍历一次,当然你这个有点像动态规划,交换次数可能比插入要少一点
要是序列稍微特殊一点,你这个算法就直接是O(N^2)了 |
|