一个神奇的快速排序算法

这个算法没有 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);
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 总结一下常见的排序算法。 排序分内排序和外排序。内排序:指在排序期间数据对象全部存放在内存的排序。外排序:指在排序...
    jiangliang阅读 5,234评论 0 1
  • 暖日斜晖潵九霄 江天一线月西偏 小病秋倦晨懒起 秋蝉啧啧奏新曲
    如如了了阅读 1,215评论 0 0
  • Swift关键字 Open Source + Growing Ecosystem Language refinem...
    雨_树阅读 3,089评论 0 0
  • 晚,十点半,母亲没睡,等着晚归的父亲。她给远来垫江的女儿—我打电话,抱怨着我最近的罪行:家不回了,最近也不再打电话...
    人之初呀阅读 1,846评论 0 1
  • 清月有薄凉 人生有激荡 有心问华时 何日见曙光 不见去日久 更待来日长 痕亦留得迹 情自留得意 前人有美妾 后人有...
    西穿阅读 1,222评论 0 0