快排

2018-01-21 23:17:06 +08:00
 ChrisLinn

想请教一下,快排这么写可以么,比经典写法少用一个 swap ?

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);
    }
}

经典写法类似于

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

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);
    }
}
2456 次点击
所在节点    算法
1 条回复
testratter
2018-02-23 13:25:24 +08:00
可以,只是代码上少一个 swap,实际运行的时候,迭代到最后一个元素,i=r 的时候,arr[i] <= pValue 永远为真,那个 swap 肯定会执行。
不过我觉得虽然省了一行,但代码明晰度下降了。
不过 i = l + 1 这个赋值在第一个元素小于 arr[r]的情况下会出错。

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

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

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

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

© 2021 V2EX