C++数据结构X篇_23_快速排序(最快、不稳定的排序)
最佳答案 问答题库698位专家为你答疑解惑
文章参考十大经典排序算法-快速排序算法详解进行整理补充。快速排序是最快的排序方法。
排序思路:分治法-挖坑填数
:大问题分解为各个小问题,对小问题求解,使得大问题得以解决
文章目录
- 1. 什么是快速排序
- 1.1 概念
- 1.2 算法原理
- 1.3 算法实现
- 1.3.1 核心代码
- 1.3.2 整体代码
- 2. 快速排序算法特点
- 2.1 时间复杂度
- 2.2 空间复杂度
- 2.3 稳定性
1. 什么是快速排序
1.1 概念
快速排序(Quick Sort)是从冒泡排序算法演变而来的,实际上是在冒泡排序基础上的递归分治法。快速排序在每一轮挑选一个基准元素,并让其他比它大的元素移动到数列一边,比它小的元素移动到数列的另一边,从而把数列拆解成了两个部分。
1.2 算法原理
这是一个无序数列:4、5、8、1、7、2、6、3,我们要将它按从小到大排序。按照快速排序的思想,我们先选择一个基准元素,进行排序。
我们选取4为我们的基准元素,并设置基准元素的位置为index(可以看做一个坑位,比较后满足条件的就填进去
),设置两个指针left和right,分别指向最左和最右两个元素
接着,从right指针开始,把指针所指向的元素和基准元素做比较,如果比基准元素大,则right指针向左移动,如果比基准元素小,则把right所指向的元素填入index中
3和4比较,3比4小,将3填入index中,原来3的位置成为了新的index,同时left右移一位
然后,我们切换left指针进行比较,如果left指向的元素小于基准元素,则left指针向右移动,如果元素大于基准元素,则把left指向的元素填入index中
5和4比较,5比4大,将5填入index中,原来5的位置成为了新的index,同时right左移一位
接下来,我们再切换到right指针进行比较,6和4比较,6比4大,right指针左移一位
2和4比较,2比4小,将2填入index中,原来2的位置成为新的index,left右移一位
随着left右移,right左移,最终left和right重合
此时,我们将基准元素填入index中,这时,基准元素左边的都比基准元素小,右边的都比基准元素大,这一轮交换结束
第一轮,基准元素4将序列分成了两部分,左边小于4,右边大于4,第二轮则是对拆分后的两部分进行比较
此时,我们有两个序列需要比较,分别是3、2、1和7、8、6、5,重新选择左边序列的基准元素为3,右边序列的基准元素为7
第二轮排序结束后,结果如下所示
此时,3、4、7为前两轮的基准元素,是有序的,7的右边只有8一个元素也是有序的,因此,第三轮,我们只需要对1、2和5、6这两个序列进行排序
第三轮排序结果如下所示
至此所有的元素都是有序的.
1.3 算法实现
1.3.1 核心代码
//快速排序 升序
void quick_sort(int arr[], int start, int end)
{int i = start;int j = end;int temp = arr[start];//基准数if (i < j){while (i < j){//从右往左找比基准数小的while (i < j && arr[j] >= temp){j--;}//填坑if (i < j){arr[i] = arr[j];i++;}//从左向右找比基准数大的数while (i < j && arr[i] < temp){i++;}//填坑if (i < j){arr[j] = arr[i];j--;}}//基准数放入i=j中arr[i] = temp;//对基准数左半部分快速排序quick_sort(arr, start, i - 1);//对基准数右半部分快速排序quick_sort(arr, j + 1, end);}}
1.3.2 整体代码
#include <iostream>
using namespace std;void swap(int* a, int* b)
{int temp = *a;*a = *b;*b = temp;
}//打印数组
void printArr(int arr[])
{for (int i = 0; i < 10; i++){cout << arr[i] << endl;}
}//快速排序 升序
void quick_sort(int arr[], int start, int end)
{int i = start;int j = end;int temp = arr[start];//基准数if (i < j){while (i < j){//从右往左找比基准数小的while (i < j && arr[j] >= temp){j--;}//填坑if (i < j){arr[i] = arr[j];i++;}//从左向右找比基准数大的数while (i < j && arr[i] < temp){i++;}//填坑if (i < j){arr[j] = arr[i];j--;}}//基准数放入i=j中arr[i] = temp;//对基准数左半部分快速排序quick_sort(arr, start, i - 1);//对基准数右半部分快速排序quick_sort(arr, j + 1, end);}}int main()
{int arr[] = { 8,2,3,9,6,4,7,1,5,10 };quick_sort(arr,0,9);printArr(arr);system("pause");return 0;
}
运行结果:
2. 快速排序算法特点
2.1 时间复杂度
快速排序算法在分治法的思想下,原数列在每一轮被拆分成两部分,每一部分在下一轮又分别被拆分成两部分,直到不可再分为止,平均情况下需要logn轮,因此快速排序算法的平均时间复杂度是O(nlogn)
在极端情况下,快速排序算法每一轮只确定基准元素的位置,时间复杂度为O(N^2)
2.2 空间复杂度
快速排序算法排序过程中只是使用数组原本的空间进行排序,因此空间复杂度为O(1)
2.3 稳定性
快速排序算法在排序过程中,可能使相同元素的前后顺序发生改变,所以快速排序是一种不稳定排序算法
- 快速排序1,快速排序2,参考博文:常见的几种排序(C++)
99%的人还看了
相似问题
- 解读可解释性机器学习:理解解释性基准模型(EBM)
- 小心你的大模型被基准评估坑了,模型直接傻掉!人大高瓴揭秘大模型作弊
- YOLOWeeds: 用于棉花生产系统中多类杂草检测的 YOLO 目标检测器的新基准
- MS1112,一款16-bit 多输入内置基准模数转换器
- 云智慧联合北航提出智能运维(AIOps)大语言模型及评测基准
- 【云原生-K8s】Kubernetes安全组件CIS基准kube-beach安装及使用
- 【论文阅读】点云地图动态障碍物去除基准 A Dynamic Points Removal Benchmark in Point Cloud Maps
- openGauss学习笔记-80 openGauss 数据库管理-内存优化表MOT管理-内存表特性-MOT性能基准
- AMEYA360:江苏润石低噪声、高精度超低温漂精密电压基准源RS5025LV
- Go语言的单元测试与基准测试详解
猜你感兴趣
版权申明
本文"C++数据结构X篇_23_快速排序(最快、不稳定的排序)":http://eshow365.cn/6-26087-0.html 内容来自互联网,请自行判断内容的正确性。如有侵权请联系我们,立即删除!
- 上一篇: ChatGLM2-6B模型尝鲜
- 下一篇: H5关闭当前页面,包括微信浏览器