深入探讨快速排序算法:C++实现与优化

深入探讨快速排序算法:C++实现与优化

快速排序(Quick Sort)是一种高效的排序算法,最早由C. A. R. Hoare在1960年提出。它采用分治法(Divide and Conquer)的策略,将一个序列分成两个子序列分别排序,然后将有序的子序列合并以得到最终的有序序列。本文将深入探讨快速排序的原理、三种不同的基准值选择方法,并提供详细的C++代码实现和优化建议。

快速排序的原理

快速排序的核心思想是通过一趟排序将待排序序列分成两部分,其中一部分的所有元素均小于另一部分的所有元素。然后递归地对这两部分进行排序,从而使整个序列达到有序。

具体步骤如下:

  1. 从序列中选择一个基准值(pivot)。
  2. 通过一趟排序将序列分成两部分,一部分所有元素小于基准值,另一部分所有元素大于基准值。
  3. 递归地对两部分分别进行快速排序,直到序列为空或仅包含一个元素。

基准值选择策略

基准值的选择对快速排序的效率有很大影响。以下是三种常用的基准值选择方法:

  1. 首元素法:直接选择序列的第一个元素作为基准值。
  2. 三数取中法:从序列的首元素、中间元素和末元素中选择中间值作为基准值。
  3. 随机选择法:随机选择序列中的一个元素作为基准值。

1. 首元素法

首元素法是最简单的一种基准值选择方法,直接选择序列的第一个元素作为基准值。实现如下:

int Partition1(int* arr, int left, int right) {
   
    int pivot = arr[left];
    int l = left + 1;
    int r = right;
    while (l <= r) {
   
        while (l <= r && arr[l] <= pivot) l++;
        while (l <= r && arr[r] >= pivot) r--;
        if (l < r) std::swap(arr[l], arr[r]);
    }
    std::swap(arr[left], arr[r]);
    return r;
}

2. 三数取中法

三数取中法通过从序列的首元素、中间元素和末元素中选择中间值作为基准值,可以在一定程度上避免最坏情况。实现如下:

int MedianOfThree(int* arr, int left, int right) {
   
    int mid = left + (right - left) / 2;
    if (arr[left] > arr[mid]) std::swap(arr[left], arr[mid]);
    if (arr[left] > arr[right]) std::swap(arr[left], arr[right]);
    if (arr[mid] > arr[right]) std::swap(arr[mid], arr[right]);
    std::swap(arr[mid], arr[right - 1]);
    return arr[right - 1];
}

int Partition2(int* arr, int left, int right) {
   
    int pivot = MedianOfThree(arr, left, right);
    int l = left;
    int r = right - 1;
    while (true) {
   
        while (arr[++l] < pivot);
        while (arr[--r] > pivot);
        if (l < r) std::swap(arr[l], arr[r]);
        else break;
    }
    std::swap(arr[l], arr[right - 1
  • 8
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

m0_57781768

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值