超详细解析C++实现快速排序算法的方法

yizhihongxing

超详细解析C++实现快速排序算法的方法

什么是快速排序?

快速排序是一种高效的排序算法。因为采用了分治法的思想,利用递归实现,每次排序只需比较部分元素,而不需要像冒泡排序和插入排序那样需要从头到尾对比每个元素,因此效率非常高。

快速排序算法的基本思想

快速排序的基本思想是:通过一趟排序将待排记录分割成独立的两部分,使得前面的记录的关键字均小于后面的记录的关键字,然后再依次对前后两部分的记录进行排序,递归完成最终的排序。

快速排序算法的实现

第一步:确定基准元素

快速排序算法的核心之一是确定一个基准元素,通常我们选择第一个或者最后一个元素作为基准元素,即以a[left]或a[right]为基准元素。

int partition(int a[],int left,int right)
{
   int pivot=a[left]; //以a[left]作为基准元素
   while(left<right){
        //从右向左查找小于基准元素的数
        while(left<right && a[right]>=pivot) right--;
        a[left]=a[right]; //将小于基准元素的数放到左边
        //从左向右查找大于基准元素的数
        while(left<right && a[left]<=pivot) left++;
        a[right]=a[left]; //将大于基准元素的数放到右边
    }
    a[left]=pivot; //将基准元素归位
    return left;   //返回基准元素的位置
}

第二步:分割数组

将数组分为两部分,以一次排序后的基准元素位置分割,左边的数都小于基准元素,右边的数都大于基准元素。

void quickSort(int a[], int left, int right)
{
    if (left < right)
    {
        int pos = partition(a, left, right); //pos为基准元素的位置
        quickSort(a, left, pos-1);  //递归排序基准元素左边的数组
        quickSort(a, pos+1, right); //递归排序基准元素右边的数组
    }
}

第三步:完整代码实现

#include <bits/stdc++.h>
using namespace std;
int partition(int a[],int left,int right)
{
   int pivot=a[left]; //以a[left]作为基准元素
   while(left<right){
        //从右向左查找小于基准元素的数
        while(left<right && a[right]>=pivot) right--;
        a[left]=a[right]; //将小于基准元素的数放到左边
        //从左向右查找大于基准元素的数
        while(left<right && a[left]<=pivot) left++;
        a[right]=a[left]; //将大于基准元素的数放到右边
    }
    a[left]=pivot; //将基准元素归位
    return left;   //返回基准元素的位置
}
void quickSort(int a[], int left, int right)
{
    if (left < right)
    {
        int pos = partition(a, left, right); //pos为基准元素的位置
        quickSort(a, left, pos-1);  //递归排序基准元素左边的数组
        quickSort(a, pos+1, right); //递归排序基准元素右边的数组
    }
}
int main()
{
    int n;
    cout<<"请输入数组大小:"<<endl;
    cin>>n;
    int a[n];
    cout<<"请输入"<<n<<"个数:"<<endl;
    for(int i=0;i<n;i++)
        cin>>a[i];
    quickSort(a,0,n-1);
    cout<<"排序后的数组为:"<<endl;
    for(int i=0;i<n;i++)
        cout<<a[i]<<" ";
    return 0;
}

示例说明

示例一

在第一次排序时,选择数组[6,3,8,2,9,1]的第一个数6作为基准元素,用左右指针分别从数组的两端开始扫描。

  • 右指针扫描,找到小于基准元素的数,此时右指针扫描到的数是1。
  • 左指针扫描,找到大于基准元素的数,此时左指针扫描到的数是8。
  • 交换左右指针扫描到的数,即将左指针扫描到的8和右指针扫描到的1位置互换。
  • 重复上述步骤,直至左右指针相遇,此时将基准元素6与左指针指向的位置互换。
  • 数组[6,3,8,2,9,1]第一次排序完成,以基准元素6为中心,左边的数都小于6,右边的数都大于6。左边的数是[3,2,1],右边的数是[8,9]。

示例二

在第二次排序时,选择数组[3,2,1]的第一个数3作为基准元素,用左右指针分别从数组的两端开始扫描。

  • 右指针扫描,找到小于基准元素的数,此时右指针扫描到的数是1。
  • 左指针扫描,找到大于基准元素的数,此时左指针扫描到的数是2。
  • 交换左右指针扫描到的数,即将左指针扫描到的2和右指针扫描到的1位置互换。
  • 重复上述步骤,直至左右指针相遇,此时将基准元素3与左指针指向的位置互换。
  • 数组[3,2,1]第二次排序完成,以基准元素3为中心,左边的数都小于3,右边的数都大于3。左边的数是[2,1],右边的数是[]。

总结

通过以上示例可以看出,每次排序后都会确定一个基准元素,并将数组分成两部分,再对左右两部分进行递归排序,最终完成排序。在实现快速排序算法时,要注意基准元素的选择和分割数组的步骤。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:超详细解析C++实现快速排序算法的方法 - Python技术站

(0)
上一篇 2023年5月19日
下一篇 2023年5月19日

相关文章

  • 可能是你看过最全的十大排序算法详解(完整版代码)

    针对“可能是你看过最全的十大排序算法详解(完整版代码)”这篇文章,下面是详细的攻略: 标题 首先,该文章的标题是:可能是你看过最全的十大排序算法详解(完整版代码) 文章简介 其次,在文章简介中,作者提到该篇文章是一个完整介绍了十大排序算法并且附有代码实现的文章,可以帮助读者了解这些排序算法的原理和代码实现。 内容 文章的主体部分是对十大排序算法进行详细的讲解…

    算法与数据结构 2023年5月19日
    00
  • javascript使用递归算法求两个数字组合功能示例

    下面是关于 JavaScript 使用递归算法求两个数字组合的完整攻略: 什么是递归? 递归是一种思想,用来解决一些需要重复执行的问题,比如求一个数的阶乘,求一个斐波那契数列等。通俗的讲,递归就是函数自己调用自己。 递归的使用场景 递归通常用于解决以下两类问题: 包含自相似性质的问题,如分形图形。 对于可被拆分为相同问题的大型问题。 求两个数字组合的递归方案…

    算法与数据结构 2023年5月19日
    00
  • 大数据情况下桶排序算法的运用与C++代码实现示例

    桶排序算法是一种基于计数的排序算法,它的主要思想是把一组数据分成多个桶,对每个桶中的数据进行排序,最后依次把每个桶中的数据合并起来,得到排序后的结果。在大数据情况下,桶排序算法可以大幅减少排序时间,因为它可以快速地将数据分成多个桶,进行并行排序,最终合并起来。 以下是桶排序算法在大数据情况下的运用及C++代码示例: 算法思路 先确定桶的数量,也就是需要将数据…

    算法与数据结构 2023年5月19日
    00
  • 详解次小生成树以及相关的C++求解方法

    详解次小生成树以及相关的C++求解方法 什么是次小生成树 在普通的生成树中,每个节点只有一条边与其相连。而次小生成树则是指,在所有的生成树中,除了最小生成树之外,权值和第二小的生成树。 求解方法 Kruskal算法 Kruskal算法是一种贪心算法,也是求解最小生成树的常用算法。我们可以对Kruskal算法做一些修改,使其求出次小生成树。 一般情况下,我们需…

    算法与数据结构 2023年5月19日
    00
  • JavaScript数据结构与算法之基本排序算法定义与效率比较【冒泡、选择、插入排序】

    JavaScript数据结构与算法之基本排序算法定义与效率比较 概述 排序是计算机科学中最常见的操作之一,是将数据按照一定的顺序重新排列的过程。排序算法被广泛应用于搜索、数据压缩、数据库等领域。JavaScript中常用的基本排序算法有3种:冒泡排序、选择排序和插入排序。本文将详细介绍这三种算法的原理、JavaScript实现以及时间复杂度比较。 冒泡排序 …

    算法与数据结构 2023年5月19日
    00
  • 深入解析桶排序算法及Node.js上JavaScript的代码实现

    深入解析桶排序算法及Node.js上JavaScript的代码实现 桶排序算法介绍 桶排序算法是一种非常有效的排序方法,通常用于在已知数据范围的情况下对数据进行排序。桶排序将数据分配到一个或多个桶中,然后对每个桶中的数据进行排序,最后将所有桶中的数据依次合并即可得到有序的结果。 桶排序的时间复杂度为O(n),其中n为待排序的数据个数。如果数据范围较大,需要分…

    算法与数据结构 2023年5月19日
    00
  • PHP实现常用排序算法的方法

    一、常用排序算法 常见的排序算法包括冒泡排序、选择排序、插入排序、希尔排序、归并排序、快速排序、堆排序等。 冒泡排序: 基本思想是每次比较相邻的两个元素,如果前者比后者大,则将它们交换位置,最终使得从左到右的每个元素都是当前序列中最小的。 选择排序: 基本思想是每次从未排序的数中选取最小的数,并将其放到已排序序列的末尾。 插入排序: 基本思想是从无序序列中取…

    算法与数据结构 2023年5月19日
    00
  • JS实现的全排列组合算法示例

    下面针对 “JS实现的全排列组合算法示例” 给出完整攻略。 什么是全排列组合算法? 全排列组合是指将一个集合中的元素排成一列,可以有不同的排列方式,这些不同的排列方式就称为全排列。当从这个集合中取出一部分排成一列时,称为排列,而取出一部分组合称为组合。 JS实现全排列组合算法的步骤 具体实现全排列组合算法的步骤如下: 定义需要排列和组合的数组或字符串; 定义…

    算法与数据结构 2023年5月19日
    00
合作推广
合作推广
分享本页
返回顶部