分治之快速排序以及快速排序为何最快
算法思想
数组排序任务可以如下完成:
1)设k=a[0],将k挪到适当位置,使得比k小的元素都在k的左边,比k大的元素都在k的右边,和k相等的,不关心在k左右出现均可(O(n)时间完成)
2)把k左边的部分快速排序
3)把k右边的部分快速排序
(假设运气比较好,每次基准元素被移动到中间,这样的话时间复杂度为O(nlogn))
如何在O(n)的时间内将数组分成两半,一般在小于基准值,一般大于基准值?
程序代码
#include<iostream>
using namespace std;
int a[100];
//交换a,b的值
void swap(int &a,int &b){int temp=a;a=b;b=temp;
}
void quickSort(int start,int end){if(start<end){//将数组首元素设为基准值int temp=a[start];//定义两个指针i,j分别指向数组的头部和尾部 int i=start,j=end; while(i<j){//偶数次交换之后,就不停的让a[j]和temp相比,此时temp是a[i] while((i<j)&&(a[j]>=temp)){j--;}//当i=j或者a[j]<temp的时候,就进行交换 swap(a[j],a[i]);//奇数次交换之后,就不停的让a[i]和temp相比,此时temp是a[j] while((i<j)&&(a[i]<=temp)){i++;}//当i=j或者a[i]>temp的时候,就进行交换 swap(a[j],a[i]);}//处理完后,a[i]=k//划分完成后,对i左边的和右边的分别进行快速排序,但是a[i] 一定不参与排序quickSort(start,i-1);quickSort(i+1,end); }
}int main(){int n;cin>>n;for(int i=0;i<n;i++){cin>>a[i];} quickSort(0,n-1);for(int i=0;i<n;i++){cout<<a[i]<<" ";} return 0;
}
时间复杂度分析
当每次划分元素的时候,左右两边的元素的个数相等,这个时候,是快速排序最好的一种情况,其时间复杂度为O(nlogn),与归并排序类似
当每次划分元素的时候,一边的元素个数为0,这个时候,是快速排序最坏的一种情况,其时间复杂度为O(n2),此时,序列通常为有序。
一般情况下,快速排序的时间复杂度是O(nlogn)
快速排序具有广泛的应用,通常认为是性能最高的排序算法,在c++的algorithm文件中的sort函数所用到的正是快速排序。
知识拓展:快速排序为何最快
我们都知道,归并排序,堆排序的时间复杂度均为O(nlogn),为何快速排序就最快了呢,因为快速排序每次都会与一个基准值做比较,如果我们把这个基准值放在寄存器里,由于寄存器的速度远远大于cache和主存的速度,所以快速排序的性能将会得到巨大的提升,所以快速排序的性能最优。
分治之快速排序以及快速排序为何最快相关推荐
- 程序填充(指针):3数排序_排序算法之快速排序,它为什么这么快?
本文将介绍排序算法中最常用,以及最重要的快速排序. 1 快速排序实例 快速排序由C. A. R. Hoare在1960年提出,是冒泡排序的一种改进.快速排序就跟它的名字一样,效率很快.跟冒泡排序,选择 ...
- 快速排序: 使用快速排序算法对数组进行排序
快速排序: 使用快速排序算法对数组进行排序 题目 一个数组有 N 个元素,使用快速排序对其进行排序输出(本题还会人工阅卷,请使用快速排序算法进行排序) 输入描述: 输入为两行. 第一行一个整数n(1 ...
- 算法设计 分治, 归并排序, 快速排序
算法思想: 分治方法与软件设计的模块化方法非常的相似.要解决一个大实例问题,可以(1)将它分解成多个更小的实例,(2)分别解决每个小实例,(3)将小实例的解组合成大实例的解. 例子: 寻找假硬币.一个 ...
- Python 数据结构与算法 —— 从分治的角度看快速排序、归并排序
这里给出分治语义的一种通用性实现: def divide_and_conquer(S, divide, combine):if len(S) <= 1: return SL, R = divid ...
- 八大排序算法之快速排序(上篇)(未经优化的快排)
目录 一.关于快速排序的总体算法思想 1.冒泡排序(交换排序) (以排升序为例) 2.快速排序的总体思想简介(以排升序为例) 二.快速排序单趟排序的算法接口设计(以排升序为例) 单趟排序实现的方法一: ...
- 三种快速排序以及快速排序的优化
1.快速排序的基本思想: 快速排序使用分治的思想,通过一趟排序将待排序列分割成两部分,其中一部分记录的关键字均比另一部分记录的关键字小.之后分别对这两部分记录继续进行排序,以达到整个序列有序的目的. ...
- java里面快速排序_Java:快速排序
快速排序相当于冒泡排序的进化版本,优点是速度比冒泡排序更快,缺点是写起来逻辑比冒泡排序啰嗦一点,没那么直观. 快速排序之所以比较快,是因为相比冒泡排序,每次交换是跳跃式的.每次排序的时候 设置一个基准 ...
- 排序下---(冒泡排序,快速排序,快速排序优化,快速排序非递归,归并排序,计数排序)
排序上 排序上 交换类排序 基本思想:所谓交换,就是根据序列中两个记录键值的比较结果来对换这两个记录在序列中的位置,交换排序的特点是:将键值较大的记录向序列的尾部移动,键值较小的记录向序列的前部移动. ...
- Java写一个快速排序_快速排序java实现
1.快速排序的思想 快速排序属于交换排序,是冒泡排序的升降版.相对于冒泡排序而言,快速排序增大了记录比较和移动的距离,将关键字较大的记录直接移动到后面,将关键字较小的记录直接移动到前面:不再是相邻两个 ...
最新文章
- Spring : 征服数据库 (两)
- 用手动和自动分别实现使用其DVD安装盘作为本地yum源
- spingboot 集成swagger2
- 提高编程水平的一段必经之路,研读官方文档
- 优秀程序员必备七要件
- linux实训项目有哪些内容,实训项目2__Linux基本命令(带参考答案)
- 导航远峰e路航v700pro刷机包
- mysql单表多次内联接查询学科名称,一级学科名称二级学科名称三级学科名称
- C语言版数据结构计算顺序表中X的个数,设计算法。数据结构课后习题,定义顺序表,查找顺序表中X元素的个数。
- 如何去除word文档中向下的箭头
- 目前建站系统用的比较多的几个系统(几款值得推荐的建站系统)
- Mac使用命令行解压rar文件
- 如何在html中在线预览pdf文件
- 绝对值编码器与增量式编码器简析
- 普通最小二乘法平面直线回归问题的三种实现(Python)
- 正则表达式里“-“中划线的使用注意
- KITTI数据集详解和评价标准
- 消防应急照明和疏散指示系统——集中控制型系统的设计与应用
- Linux系统的atop监控工具
- 入门webpack(七)Webpack中的css-loader 和style-loader