快速排序--C++实现

1. 简述

快速排序是一种分而治之的排序,其主要流程为。

  1. 选择关键元素
  2. 找到元素所在位置
  3. 分成左右两个区间重复过程

2. 实现

2.1 不能理解
cpp 复制代码
int QuickSort::partition_v2(int *arr, int lo, int hi)
{
    if ( lo == hi)
        return lo;
    int pivot = arr[lo];
    int i = lo;
    int j = hi;

    while ( i < j) {

        while ( i < j && arr[j] >= pivot)
            --j;
        arr[i] = arr[j];

        while ( i < j && arr[i] <= pivot )
            i++;

        arr[j] = arr[i];
    }

    arr[j] = pivot;

    return j;
}
void QuickSort::quick_sort_impl_v2(int *arr, int lo, int hi)
{
    if ( lo >= hi || hi < 0 || lo < 0)
        return;

    int pos = partition_v2(arr, lo, hi);


    quick_sort_impl_v2(arr, lo, pos - 1);
    quick_sort_impl_v2(arr,pos + 1, hi);
}
2.2 自己写的
cpp 复制代码
int QuickSort::partition_v1(int *arr, int lo, int hi)
{
    if ( lo == hi)
        return lo;

    int pivot = arr[lo];

    int i = lo + 1;
    int j = hi;

    while ( i < j )
    {
        while ( i < j && arr[i] <= pivot )
            ++i;


        while ( i < j && arr[j] >= pivot )
            --j;

        if ( i < j ) {
            int tmp = arr[i];
            arr[i] = arr[j];
            arr[j] = tmp;
        }
    }
    int pos = j;
    if ( arr[pos] > pivot)
        --pos;
    arr[lo] = arr[pos];
    arr[pos] = pivot;


    return pos;
}
void QuickSort::quick_sort_impl_v2(int *arr, int lo, int hi)
{
    if ( lo >= hi || hi < 0 || lo < 0)
        return;

    int pos = partition_v2(arr, lo, hi);


    quick_sort_impl_v2(arr, lo, pos - 1);
    quick_sort_impl_v2(arr,pos + 1, hi);
}
2.3 算法导论版
cpp 复制代码
int QuickSort::partition_v3(int *arr, int lo, int hi)
{
    int pivot = arr[hi];

    int i = lo - 1;

    for ( int j = lo;j < hi; ++j) {
        if ( arr[j] < pivot) {
            i++;
            std::swap(arr[i], arr[j]);
        }
    }

    std::swap(arr[hi],arr[i + 1]);

    return i + 1;
}

void QuickSort::quick_sort_impl_v3(int *arr, int lo, int hi)
{
    if ( lo >= hi || hi < 0 || lo < 0)
        return;

    int pos = partition_v3(arr, lo, hi);


    quick_sort_impl_v2(arr, lo, pos - 1);
    quick_sort_impl_v2(arr,pos + 1, hi);
}
相关推荐
ym hyd 1114 小时前
试题库管理系统源码 Java+SpringBoot+Vue3 前后分离
java·vue.js·spring boot·毕设
AC赳赳老秦4 小时前
采集行为合规自检:OpenClaw 自动校验 robots 协议与采集频率,规避违规采集风险
java·开发语言·c++·python·php·deepseek·openclaw
钱栈up4 小时前
mvn compile 卡死在 javac 阶段:一次类型不匹配的排查与修复
java·开发语言
无名猿4 小时前
C++ 查找算法:std::find 与容器成员 find 的性能差距
c++·性能优化·stl·标准库
程序猿编码5 小时前
工业视觉多任务方案:可编程梯度信息视觉框架,训练评估 + C++ 部署完整实战
开发语言·c++·视觉·推理引擎
吠品6 小时前
CSS图片模糊过渡:一个transition加filter就够
java·数据库·notepad++
朝朝辞暮i6 小时前
C++ 第 21 课:struct —— 把一组相关数据打包在一起
开发语言·c++·算法
步行cgn6 小时前
Spring 全注解开发详解
java·后端·spring
青梅橘子皮6 小时前
Blue---二分算法(二分查找与二分答案)
算法
长河6 小时前
Java的GC(垃圾回收)中,标记无用对象的核心方法是可达性分析算法
java·jvm·算法