快排这么写有错不

2018-01-21 23:52:21 +08:00
 ChrisLinn
int partition(int arr[], int l, int r) {
    int pPos = l, pValue = arr[l];
    for (int i = l+1; i <= r; ++i)
        if (arr[i] <= pValue) std::swap(arr[i], arr[pPos++]);
    return pPos;
}

void quicksort(int arr[], int l, int r) { 
    if (l < r) {
        int pivot = partition(arr, l, r);
        quicksort(arr, l, pivot-1);
        quicksort(arr, pivot+1, r);
    }
}

比经典写法少用一个 swap ?


int partition(int arr[], int l, int r) {
    int pPos = l, pValue = arr[r];
    for (int i = l; i < r; ++i)
        if (arr[i] <= pValue) std::swap(arr[i], arr[pPos++]);
    std::swap(arr[pPos], arr[r]);
    return pPos;
}

void quicksort(int arr[], int l, int r) { 
    if (l < r) {
        int pivot = partition(arr, l, r);
        quicksort(arr, l, pivot-1);
        quicksort(arr, pivot+1, r);
    }
}
1163 次点击
所在节点    问与答
4 条回复
ConradG
2018-01-22 16:56:46 +08:00
第一个是错的,以 pValue 为界左小右大的性质不能保持。
ChrisLinn
2018-01-22 22:35:21 +08:00
@ConradG 可不可以给个 case 谢谢,我设计的几个 case 都正确排序了
ConradG
2018-01-22 23:21:37 +08:00
@ChrisLinn [2,4,1,3]
ChrisLinn
2018-01-24 10:51:42 +08:00
@ConradG xiexie~

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/424771

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX