快速排序--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);
}
相关推荐
皮皮林5513 小时前
拒绝写重复代码,试试这套开源的 SpringBoot 组件,效率翻倍~
java·spring boot
归去_来兮5 小时前
拉格朗日插值算法原理及简单示例
算法·数据分析·拉格朗日插值
顺风尿一寸7 小时前
从 Java NIO poll 到 Linux 内核 poll:一次系统调用的完整旅程
java
程途知微7 小时前
JVM运行时数据区各区域作用与溢出原理
java
华仔啊9 小时前
为啥不用 MP 的 saveOrUpdateBatch?MySQL 一条 SQL 批量增改才是最优解
java·后端
千寻girling11 小时前
Python 是用来做 AI 人工智能 的 , 不适合开发 Web 网站 | 《Web框架》
人工智能·后端·算法
xiaoye201811 小时前
Lettuce连接模型、命令执行、Pipeline 浅析
java
颜酱14 小时前
一步步实现字符串计算器:从「转整数」到「带括号与优化」
javascript·后端·算法
beata15 小时前
Java基础-18:Java开发中的常用设计模式:深入解析与实战应用
java·后端
Seven9715 小时前
剑指offer-81、⼆叉搜索树的最近公共祖先
java