我的快速排序算法跑出來的結果不對,請各位幫忙看看是什麼原因呢?

我的算法思路是:取数组的第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

這是什麼原因呢

阅读 2k
2 个回答

subsort写得有问题,改成下面就行

long subsort(long arr[], long left, long right) {
    long key = arr[left];
    while (left < right) {
        while (left < right && arr[right] >= key) {
            --right;
        }
        swap(&arr[left], &arr[right]);
        while (left < right && arr[left] < key) {
            ++left;
        }
        swap(&arr[left], &arr[right]);
    }
    return left;
}
新手上路,请多包涵

应该用left-1和pivot换

3 4 2 8 6 5 9 0 1 7
3 1 2 8 6 5 9 0 4 7
3 1 2 0 6 5 9 8 4 7
-- 这里换错了
6 1 2 0 3 5 9 8 4 7

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题