快速排序--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);
}
相关推荐
攻城有术9 分钟前
专项攻克-SpringBoot启动后 Bean的实例数量问题
java·spring boot·后端
步行cgn20 分钟前
PageHelper 的用法
java·后端
万法若空26 分钟前
CSP-J/S 排序算法完整专题训练题单
数据结构·算法·排序算法
凉茶钱26 分钟前
【数据结构】排序(快排,选择,直接插入,希尔)
数据结构·算法·排序算法
weixin_4462608534 分钟前
拆解再复用:大模型智能体的跨任务技能迁移
人工智能·深度学习·算法
Sam_Deep_Thinking36 分钟前
从REST到gRPC,一个API选型的思考框架
java·后端·程序员
无毁的湖光-Al1 小时前
解Bug之路-with AI-应用被限流?
java·linux
Brilliantwxx1 小时前
【Linux】 进程(4)七大进程状态深度解析
linux·运维·算法
程序员贺加贝1 小时前
别把 ThreadLocal 写进 Serializer:一次 SaaS 多租户 Jackson 上下文污染排查
java·spring boot
许彰午1 小时前
06-EaEngine调度器
java·低代码·架构