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

超详细解析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日

相关文章

  • C语言之直接插入排序算法的方法

    C语言直接插入排序算法的方法 什么是直接插入排序 直接插入排序,是一种应用最广泛的排序算法之一,也是一种稳定的排序算法。它的基本思想是将一个记录插入到已经排好序的有序表中,从而得到一个新的有序表。具体的过程是将待排序的元素插入到已经排好序的元素中,使插入后仍保持有序。 代码实现 下面是用C语言实现直接插入排序算法的代码: void direct_insert…

    算法与数据结构 2023年5月19日
    00
  • 人脸检测中AdaBoost算法详解

    人脸检测中AdaBoost算法详解 什么是AdaBoost算法? AdaBoost(Adaptive Boosting,自适应增强算法)是一种分类算法,它可以将若干个弱分类器组合起来形成一个强分类器,以提高分类的准确率和鲁棒性。AdaBoost最初用于人脸识别领域,在实际应用中具有良好的效果。 AdaBoost分类器是如何工作的? AdaBoost分类器是基…

    算法与数据结构 2023年5月19日
    00
  • PHP排序算法之冒泡排序(Bubble Sort)实现方法详解

    PHP排序算法之冒泡排序(Bubble Sort)实现方法详解 冒泡排序概述 冒泡排序是一种基本的排序算法,它的基本思想是比较相邻的两个元素,如果前一个元素比后一个元素大,就交换这两个元素,重复进行这个过程,直到没有任何一对元素需要比较为止。冒泡排序得名于通过交换相邻的元素来把最大值“冒泡”到数列的尽头。 冒泡排序的时间复杂度为O(n²),效率较低,但其思想…

    算法与数据结构 2023年5月19日
    00
  • 合并排序(C语言实现)

    合并排序(C语言实现) 合并排序是一种将待排序序列分成多个子序列,分别进行排序,然后再将排序后的子序列合并成整体有序序列的排序算法。使用递归实现时,该算法的时间复杂度为O(nlogn),因此被广泛应用。 实现步骤 合并排序可以用以下步骤来实现: 分治:将待排序序列从中间分成两部分,递归地对左右两部分进行排序。 合并:将两个有序子序列合并成一个有序序列。 在实…

    算法与数据结构 2023年5月19日
    00
  • 思科CCNA认证学习笔记(一)网络基础知识

    思科CCNA认证学习笔记(一)网络基础知识攻略 概述 思科CCNA认证是网络行业的重要认证之一,具有广泛的认可度和传播力。其中网络基础知识是CCNA考试的重要内容,对于初学者来说,掌握网络基础知识是入门的必经之路。本篇攻略将详细讲解网络基础知识的相关内容,包括讲解网络的概念、网络的分类、网络的拓扑结构、网络的协议以及网络的设备。 网络的概念 网络是由两台或两…

    算法与数据结构 2023年5月19日
    00
  • C/C++语言八大排序算法之桶排序全过程示例详解

    C/C++语言八大排序算法之桶排序全过程示例详解 什么是桶排序 桶排序(Bucket Sort)是一种线性排序算法,它的基本思想是将数组内的元素根据某个规则分配到若干个桶中,然后对每个桶内的元素进行排序,最终合并每个桶内的有序元素即可得到原数组的有序结果。 桶排序的主要应用场景是待排序元素的分布比较均匀的情况下,性能表现优于其他排序算法(例如快速排序、归并排…

    算法与数据结构 2023年5月19日
    00
  • PHP字符串逆序排列实现方法小结【strrev函数,二分法,循环法,递归法】

    下面我将为您详细讲解“PHP字符串逆序排列实现方法小结【strrev函数,二分法,循环法,递归法】”的完整攻略。 什么是字符串逆序排列? 字符串逆序排列指的是将一个字符串中的字符按照相反的顺序重新排列,比如将字符串 “hello world” 更改为 “dlrow olleh”。 使用strrev函数实现字符串逆序排列 PHP内置函数 strrev() 可以…

    算法与数据结构 2023年5月19日
    00
  • 排序算法图解之Java插入排序

    首先要了解什么是插入排序,插入排序是排序算法中简单直观的一种,其原理是将未排序的元素一个一个插入到已经排好序的元素中,最终得到一个有序的序列。那么下面我将用Java代码来演示插入排序的实现过程,并且提供详细的注释帮助读者理解。 算法步骤 从第一个元素开始,认为第一个元素是已经排好序的,取第二个元素和已排序的元素进行比较,如果第二个元素比已排序的元素小,则交换…

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