快速排序--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);
}
相关推荐
427724001 小时前
IDEA使用git不提示账号密码登录,而是输入token问题解决
java·git·intellij-idea
chengooooooo2 小时前
苍穹外卖day8 地址上传 用户下单 订单支付
java·服务器·数据库
李长渊哦2 小时前
常用的 JVM 参数:配置与优化指南
java·jvm
计算机小白一个2 小时前
蓝桥杯 Java B 组之设计 LRU 缓存
java·算法·蓝桥杯
万事可爱^2 小时前
HDBSCAN:密度自适应的层次聚类算法解析与实践
算法·机器学习·数据挖掘·聚类·hdbscan
黑不溜秋的2 小时前
C++ 设计模式 - 策略模式
c++·设计模式·策略模式
大数据追光猿4 小时前
Python应用算法之贪心算法理解和实践
大数据·开发语言·人工智能·python·深度学习·算法·贪心算法
Dream it possible!5 小时前
LeetCode 热题 100_在排序数组中查找元素的第一个和最后一个位置(65_34_中等_C++)(二分查找)(一次二分查找+挨个搜索;两次二分查找)
c++·算法·leetcode
夏末秋也凉5 小时前
力扣-回溯-46 全排列
数据结构·算法·leetcode
南宫生5 小时前
力扣每日一题【算法学习day.132】
java·学习·算法·leetcode