快速排序--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);
}
相关推荐
归去_来兮1 小时前
深度学习模型在C++平台的部署
c++·深度学习·模型部署
秋千码途2 小时前
小架构step系列08:logback.xml的配置
xml·java·logback
飞翔的佩奇2 小时前
Java项目:基于SSM框架实现的旅游协会管理系统【ssm+B/S架构+源码+数据库+毕业论文】
java·数据库·mysql·毕业设计·ssm·旅游·jsp
pay4fun3 小时前
2048-控制台版本
c++·学习
时来天地皆同力.3 小时前
Java面试基础:概念
java·开发语言·jvm
找不到、了3 小时前
Spring的Bean原型模式下的使用
java·spring·原型模式
阿华的代码王国3 小时前
【Android】搭配安卓环境及设备连接
android·java
YuTaoShao4 小时前
【LeetCode 热题 100】141. 环形链表——快慢指针
java·算法·leetcode·链表
hjjdebug4 小时前
ffplay6 播放器关键技术点分析 1/2
c++·ffmpeg·音视频
铲子Zzz4 小时前
Java使用接口AES进行加密+微信小程序接收解密
java·开发语言·微信小程序