一个神奇的快速排序算法

2018-11-13  本文已影响0人  修司敦

这个算法没有 swap 过程,直接把个别元素复制到了另一个位置,但是到最后依旧可以排序,而且没有丢失任何一个元素。我花了一上午模拟过程才明白了这个算法:

void QuickSort(vector<int>& v, int low, int high) {
    if (low >= high)        // 结束标志
        return;
    int first = low;        // 低位下标
    int last = high;        // 高位下标
    int key = v[first];     // 设第一个为基准

    while (first < last)
    {
        // 将比第一个小的移到前面
        while (first < last && v[last] >= key)
            --last;
        if (first < last)
            v[first++] = v[last]; //这里是替换而不是交换

        // 将比第一个大的移到后面
        while (first < last && v[first] <= key)
            ++first;
        if (first < last)
            v[last--] = v[first]; //这里是替换而不是交换
    }
    // 基准置位
    v[first] = key; //但是到这里的时候,数组里的元素只是换了位置,而没有丢失掉任何一个
    // 前半递归
    QuickSort(v, low, first - 1);
    // 后半递归
    QuickSort(v, first + 1, high);
}
上一篇下一篇

猜你喜欢

热点阅读