我的算法思路是:取数组的第0个元素(arr[0])为枢纽。数组arr[0]为左指针,数组arr[9]为右指针。先左指针一直右移,直到找到一个比枢纽key大的数字后停下,接着右指针开始左移,直到找到一个枢纽key小的数字后停下。然后左右指针指向的元素交换数据,一直不停的循环,直到left=right之后停止,并且把枢纽值放到left,也就是他在数据中实际有序的那个位置。然后返回这个位置,接着从这个位置的两边开始开始分治,进行递归子排序,直到left=right为止。
但是这个思路写出来的代码,怎么跑结果都不正确,请各位帮忙看看是什么原因?
#include <iostream>
void printarr(long n, long arr[]) {
printf("\n");
for (int i = 0; i < n; ++i) {
printf("%ld,", arr[i]);
}
printf("\n");
}
void swap(long *x, long *y)//使用指针传递地址
{
long temp = *x;
*x = *y;
*y = temp;
}
long subsort(long arr[], long left, long right) {
long pivot = left, key = arr[pivot];
++left;
while (left < right) {
while (left < right && arr[left] < key) {
++left;
}
while (left < right && arr[right] > key) {
--right;
}
swap(&arr[left], &arr[right]);
}
swap(&arr[left], &arr[pivot]);
return left;
}
void quicksort(long arr[], long left, long right) {
if (left < right) {
long pivot = subsort(arr, left, right);
quicksort(arr, left, pivot-1);
quicksort(arr, pivot+1, right);
}
}
void f(long n) {
// long arr[n];
//// for (long i = 0; i < n; ++i) {
//// arr[i] = i;
//// }
// for (long i = n-1; i >= 0; --i) {
// arr[n-i-1] = i;
// }
long arr[10] = {3,4,2,8,6,5,9,0,1,7};
printarr(n, arr);
quicksort(arr, 0, n - 1);
printarr(n, arr);
}
int main() {
// printf("\n%d\n", 1/2);
f(10);
// std::cout << "Hello, World!" << std::endl;
return 0;
}
跑出來的結果是:
/Users/changwei/CLionProjects/QuickSort/cmake-build-debug/QuickSort
3,4,2,8,6,5,9,0,1,7,
1,0,2,6,3,4,8,5,7,9,
Process finished with exit code 0
這是什麼原因呢
subsort写得有问题,改成下面就行