快速排序(C++)
快速排序
快速排序是面试中经常问到的排序算法
基本思想:通过一趟排序将待排序记录分割成独立的两部分,其中一部分记录的关键字均比另一部分记录的关键字小,
则可分别对这两部分记录继续进行排序,以达到整个序列有序的目的
代码如下:
1.swap 交换函数
void swap(int& a,int& b)
{
int temp = a;
a = b;
b = temp;
}
2.Partition函数—快速排序中最关键的函数
int Partition(int* list,int low,int high)
{
int pivot = list[low];
while(low<high)
{
while(low<high&&list[high]>=pivot)
high--;
swap(list[low],list[high]);
while(low<high&&list[low]<=pivot)
low++;
swap(list[low],list[high]);
}
return low;
}
3.QSort函数—快速排序算法实现—递归
void QSort(int* list,int low ,int high)
{
int pivotKey;
if(low<high)
{
pivotKey = Partition(list,low,high);
QSort(list,low,pivotKey-1);
QSort(list,pivotKey+1,high);
}
}
改进算法:
1.优化选取枢轴
Partition函数中选取pivotKey是一个关键,如果pivotKey选取的不是中间数,效率会受到不同程度的影响
比如数组{9,1,5,8,3,7,6,2},pivotKey = 9,partition结果是最后一位,只是实现了9和2的互换
改进办法:
1.取随机数
2.三数取中:取三个关键字先进行排序,将中间数作为枢轴,一般是取左端、右端、中间三个数
在Partition基础之上,添加、修改成如下代码:
int pivotKey;
int m = low+(high-low)/2;
if(list[low]>list[high])
swap(list[low],list[high]);
if(list[m]>list[high])
swap(list[m],list[high]);
if(list[m]<list[low])
swap(list[m],list[low]);
pivotKey = list[m];
当然也可以九数取中
2.优化不必要的交换
int Partition2(int* list,int low,int high)
{
int pivotKey;
//可以加上三数取中
pivotKey = list[low];
int temp = pivotKey;
while(low<high)
{
while(low<high&&list[high]>=pivotKey)
high--;
list[low] = list[high];
while(low<high&&list[low]<=pivotKey)
low++;
list[high] = list[low]
}
list[low] = temp;
return low;
}
3.优化小数组时的排序方案
如果数组是小数组,应该采用插入排序,如果数组较长,应该采用快速排序
void QSort1(int* list,int low,int high)
{
int pivot;
if((high-low)>MAX_LENGTH)
{
pivot = Partition(list,low,high);
QSort1(list,low,pivot-1);
QSort1(list,pivot+1,high);
}else{ InsertSort(list);
}
}
4.优化递归操作
void QSort2(int *list,int low,int high)
{
int pivot;
if((high-low)>MAX_LENGTH)
{
while(low<high)
{
pivot = Partition(list,low,high);
QSort2(list,low,pivot-1);
low = pivot+1;
}
}else
{
InsertSort(list);
}
}
快速排序(C++)的更多相关文章
- [C#][算法] 用菜鸟的思维学习算法 -- 马桶排序、冒泡排序和快速排序
用菜鸟的思维学习算法 -- 马桶排序.冒泡排序和快速排序 [博主]反骨仔 [来源]http://www.cnblogs.com/liqingwen/p/4994261.html 目录 马桶排序(令人 ...
- 算法与数据结构(十六) 快速排序(Swift 3.0版)
上篇博客我们主要聊了比较高效的归并排序算法,本篇博客我们就来介绍另一种高效的排序算法:快速排序.快速排序的思想与归并排序类似,都是采用分而治之的方式进行排序的.快速排序的思想主要是取出无序序列中第一个 ...
- [算法]——快速排序(Quick Sort)
顾名思义,快速排序(quick sort)速度十分快,时间复杂度为O(nlogn).虽然从此角度讲,也有很多排序算法如归并排序.堆排序甚至希尔排序等,都能达到如此快速,但是快速排序使用更加广泛,以至于 ...
- 排序算法----调用库函数qsort进行快速排序
功 能: 快速排序 头文件:stdlib.h 用 法: void qsort(void *base,int nelem,int width,int (*fcmp)(const void *,const ...
- Html5 快速排序演示
快速排序(Quicksort)是对冒泡排序的一种改进.快速排序由C. A. R. Hoare在1962年提出. 它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另 ...
- Java 快速排序两种实现
快速排序,只要学习过编程的人肯定都听说过这个名词,但是有时候写的时候还真蒙住了,网上搜罗了下以及查阅了"introduction to algorithm",暂时找到两种实现快排的 ...
- java基础算法之快速排序
快速排序(Quicksort)是对冒泡排序的一种改进.在大学学过之后现在基本忘了,最近在好多地方都看到说快速排序在面试会问到,于是自己也准备重新拾起以前忘记的东西来,慢慢的积累自己的基础知识.figh ...
- PAT 1045. 快速排序(25)
著名的快速排序算法里有一个经典的划分过程:我们通常采用某种方法取一个元素作为主元,通过交换,把比主元小的元素放到它的左边,比主元大的元素放到它的右边. 给定划分后的N个互不相同的正整数的排列,请问有多 ...
- 快速排序中的partition函数的枢纽元选择,代码细节,以及其标准实现
很多笔试面试都喜欢考察快排,叫你手写一个也不是啥事.我很早之前就学了这个,对快速排序的过程是很清楚的.但是最近自己尝试手写,发现之前对算法的细节把握不够精准,很多地方甚至只是大脑中的一个映像,而没有理 ...
- php冒泡排序和快速排序
如有错误,请指出... //快速排序(array_merge整合数组)function quick_sort($arr){ $num=count($arr); if($num<=1){ retu ...
随机推荐
- Echarts的应用实践
Echarts官网:https://echarts.apache.org/ echarts是百度推出的,使用JavaScript实现的开源可视化库,可以提供直观.可定制化的数据可视化图表,包括折线图. ...
- vue源码阅读笔记
1.yarn test [文件名] -t [name-of-spec(describe or test )] 直接运行yarn test,会测试所有测试文件:yarn test 后面只跟文件名的话会 ...
- chanakya
仅供个人娱乐 参考http://www.saulgoodman.cn/HA-Chanakya.html 靶机信息 https://www.vulnhub.com/entry/ha-chanakya,3 ...
- homeless靶机
仅供个人娱乐 靶机信息 下载地址:https://www.vulnhub.com/entry/homeless-1,215/ 一.主机扫描 二.信息收集 在网页源码和页面上,我们发现User-Agen ...
- 🔥 LeetCode 热题 HOT 100(31-40)
75. 颜色分类 思路:将 2 往后放,0 往前放,剩余的1自然就放好了. 使用双指针:left.right 分别指向待插入的 0 和 2 的位置,初始 left 指向数组头,right 指向数组尾部 ...
- QT经验(一)——按钮长按事件分析
引言 最近在做qt项目,需要对button按钮添加一个长按事件(比如点击按钮,开始运动.松开按钮,运动停止).查了些许资料,(差点误把QPushButton的press信号和长按事件混淆)在此记录一下 ...
- 桌面小部件AppWidgetProvider简单分析
1.一般桌面小部件涉及到的类 AppWidgetProvider :BroadcastRecevier子类,用于接收更新,删除通知 AppWidgetProvderInfo:AppWidget相关信息 ...
- Android招聘市场技术要求越来越高,从事三年开发是否应该考虑转行?
这是在某论坛看到的一个网友的疑问,他说感觉现在Android 开发这条路越来越难走了.下面是他的分享: 本来已经做好了好几个月找不到工作的准备.不过这两周感觉面试机会还算可以.两周10个面试感觉刚刚好 ...
- ABP框架使用Oracle数据库,并实现从SQLServer中进行数据迁移的处理
ABP框架的数据访问底层是基于EFCore(Entity Framework Core)的,是微软标志性且成熟的ORM,因此它本身是支持多种主流数据库MySQL,SqlServer,Oracle,SQ ...
- SpringMVC学习05(整合ssm)
5.整合SSM 环境要求 环境: IDEA MySQL 5.7.19 Tomcat 9 Maven 3.6 要求: 需要熟练掌握MySQL数据库,Spring,JavaWeb及MyBatis知识,简单 ...