快速排序(Quicksort)是对冒泡排序的一种改进。
快速排序由C. A. R. Hoare在1962年提出。它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。
设要排序的数组是A[0]……A[N-1],首先任意选取一个数据(通常选用数组的第一个数)作为关键数据,然后将所有比它小的数都放到它前面,所有比它大的数都放到它后面,这个过程称为一趟快速排序。值得注意的是,快速排序不是一种稳定的排序算法,也就是说,多个相同的值的相对位置也许会在算法结束时产生变动。
一趟快速排序的算法是:
1)设置两个变量i、j,排序开始的时候:i=0,j=N-1;
2)以第一个数组元素作为关键数据,赋值给key,即key=A[0];
3)从j开始向前搜索,即由后开始向前搜索(j--),找到第一个小于key的值A[j],将A[j]和A[i]互换;
4)从i开始向后搜索,即由前开始向后搜索(i++),找到第一个大于key的A[i],将A[i]和A[j]互换;
5)重复第3、4步,直到i=j; (3,4步中,没找到符合条件的值,即3中A[j]不小于key,4中A[i]不大于key的时候改变j、i的值,使得j=j-1,i=i+1,直至找到为止。找到符合条件的值,进行交换的时候i, j指针位置不变。另外,i==j这一过程一定正好是i+或j-完成的时候,此时令循环结束)。
示例:假设用户输入了如下数组:
aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAArkAAAA5CAIAAAC9E6QSAAAG0UlEQVR4nO2cQVKrShhG3RO7YRlugH04Yv5mbsBiC1nArcrEbfQbxEQU6JwmotD/OWVZSS7XwlNfw0c3+JTmeH75N/t5ZN7f3/96F46BoiCKgigKoiiIojIsnf2firaOjPGCKAqiKIiiIIqCKCqDXeFRjBdEURBFQRQFURREURnsCo9ivCCKgigKoiiIoiCKyrDYFZ5f/s1+/fL+7R/jBVEURFEQRUEUBVFUhqVK8HQ6nf56346B8YIoCqIoiKIgioIoCnITdTqd7AoU4wVRFERREEVBFAVRFMSusAbjBVEURFEQRUEUBVEUZKuu0DTNT/2oHWK8IIqCKAqiKIiiIPWJenuY2R9b1hWae4y3nP0vP2BiB7B4Dd3ld2778+Z7tFMKxuG5b5tu2HJn9gwSde7b6zgKawqJuo68wJ6KToGhxx4RNRp5BwjV29vbfw/wM11hTP7EX00tmAXE63P4RR6I9ID1cXCPqgmJGrpb6zz3bdQGel/UaLw59AiXE2FUT0jU0B3Jz2G6Qn2zCFPYkf2arsBHLDgOm6bth7iWEhH19XB1rIPXD1I2Y+zQu8u5b9uuC6uJXvgdqZrvtCtkGkNaWLMo+rX3Cbq4+UzX6IowGK5BQAoXTU0UInKmmKjLcSqyJ3jhd5wViN12hTRXF6adoI6KcANdBdoV7AqY0tXloHkqulyOfa8QXIZv+3PwscdWtW5BOsAcw367QppUgcytjnXgvALErgDBooYu8gnQCRhMyTEq9NgrfQ5i/8t/u+4KaTLNMPu2msbg/QoQuwKEPwcR11FKqcYj+0bcFfX13v64kzD1JeowXeHb29nqcHTgcxCXsRf5JGhXgLCJ0MCCrrj8B/GZSUhhos59u3dVe+8Ks/86rQhhukLy7yskuwJmxVVgTFmFT8PHHXt2BUh9iTpkV4AbH476/tTXRigKoiiIoiCKgtQnaqkrTLfcXVeo5lHJG/XFayMUBVEURFEQRUHqE5WZVxhv9nvzCpGpL14boSiIoiCKgigKUp+o/BrEZZvMBnaFn6S+eG2EoiCKgigKoihIfaJ2d79CZOqL10YoCqIoiKIgioLUJ8qusCPqi9dGKAqiKIiiIIqC1CfKrrAj6ovXRigKoiiIoiCKgtQnyq6wI+qL10YoCqIoiKIgioLUJ8qusCPqi9dGKAqiKIiiIIqC1Cfql7rCu4iIiByT19fXlwd4fX1d+slfusLvFJ+j815dFd0IRUEUBVEURFGQ+kS5BrEj6ovXRigKoiiIoiCKgtQn6u1hZn+sXWEN9cVrIxQFURREURBFQRQFsSuswXhBFAVRFERREEVBFAWxK6zBeEEUBVEURFEQRUEUBbErrMF4QRQFURREURBFQRQFsSuswXhBFAVRFERREEVBFAWxK6zBeEEUBVEURFEQRUEUBbErrMF4QRQFURREURBFQRQFWdkVmqaZfZ3/sBqMF0RREEVBFAVRFERRkOKucCkB0++zm11efOOndv0PYfE69+3lN2778+a7tE+QqJunpumG7fdpl9wVNZIU2hVK1NDFlpRS8dBTVBZF/cK8wrd/jdMVhu4aq6EL2xaAqJGdc99GNVV2cWOiMpz79jryRi/DUTT0Ao88KOojR4pKsCvMThLwt5HmFT6rQmTui/rqKay1kq4QuCmUlqrAZQGVqs8chR15K0QFHX1r5hXGp/y78wdLGxwaGK++cw2iaC3QcXifwKe/lAoTFdmV8woQuwJk/f0K30pApitEnFc4920zmgkNmq6iI3vk4xUXFfdQdYGK+lhgjuuKiRrCX86Ur0FElVW8BjF+Mf0+3vLb53W0hAtWUUjJKTCqo5QSFxU3Sh84UwVh1zNXOZ9nw3AU3dvY9kPYK7+VaxDTt9OJhG9vY80rpKGzK5SMw6AHqivwFBg3SVdKn3ALuw6PbhXyGLWmfcYM1GP3Nt4+TPfWIKafH5qy5yBcg8hgUUgpFTyFGzVJVzwFQpxXgBTf2BHU09r7FdLXs/60ASwtT8TpCqOnvKOGyz8bgMGJCnrmu0FEjUIVV1fhH6JQVJabqLieHn4OImXnFW7f461BSEqKwigKoiiIoiCKgqxZg7i9TgtzBrOLFNPXx8V4QRQFURREURBFQRQF+dIVnl/+zX797S7uEOMFURREURBFQRQFUVSGpUrwtLT1L+/f/jFeEEVBFAVRFERREEVlWDr72xUoxguiKIiiIIqCKAqiqAx2hUcxXhBFQRQFURREURBFZbArPIrxgigKoiiIoiCKgigqg13hUYwXRFEQRUEUBVEURFEZ7AqPYrwgioIoCqIoiKIgispQ3BVOIiIiEomlrvA/znwsd/v9SoIAAAAASUVORK5CYII=" alt="" />
创建变量i=0(指向第一个数据), j=5(指向最后一个数据), k=6(赋值为第一个数据的值)。
我们要把所有比k小的数移动到k的左面,所以我们可以开始寻找比6小的数,从j开始,从右往左找,不断递减变量j的值,我们找到第一个下标3的数据比6小,于是把数据3移到下标0的位置,把下标0的数据6移到下标3,完成第一次比较:
aaarticlea/png;base64,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" alt="" />
i=0 j=3 k=6
接着,开始第二次比较,这次要变成找比k大的了,而且要从前往后找了。递加变量i,发现下标2的数据是第一个比k大的,于是用下标2的数据7和j指向的下标3的数据的6做交换,数据状态变成下表:
aaarticlea/png;base64,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" alt="" />
i=2 j=3 k=6
称上面两次比较为一个循环。
接着,再递减变量j,不断重复进行上面的循环比较。
在本例中,我们进行一次循环,就发现i和j“碰头”了:他们都指向了下标2。于是,第一遍比较结束。得到结果如下,凡是k(=6)左边的数都比它小,凡是k右边的数都比它大:
aaarticlea/png;base64,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" alt="" />
如果i和j没有碰头的话,就递加i找大的,还没有,就再递减j找小的,如此反复,不断循环。注意判断和寻找是同时进行的。
然后,对k两边的数据,再分组分别进行上述的过程,直到不能再分组为止。
注意:第一遍快速排序不会直接得到最终结果,只会把比k大和比k小的数分到k的两边。为了得到最后结果,需要再次对下标2两边的数组分别执行此步骤,然后再分解数组,直到数组不能再分解为止(只有一个数据),才能得到正确结果。
调用函数
在c++中可以用函数qsort()可以直接为数组进行排序。
用 法:
void qsort(void *base, int nelem, int width, int (*fcmp)(const void *,const void *));
参数:
1 待排序数组首地址
2 数组中待排序元素数量
3 各元素的占用空间大小
4 指向函数的指针,用于确定排序的顺序
C语言版本
void sort(int *a, int left, int right)
{
if(left >= right)/*如果左边索引大于或者等于右边的索引就代表已经整理完成一个组了*/
{
return ;
}
int i = left;
int j = right;
int key = a[left];
while(i < j) /*控制在当组内寻找一遍*/
{
while(i < j && key <= a[j])
/*而寻找结束的条件就是,1,找到一个小于或者大于key的数(大于或小于取决于你想升
序还是降序)2,没有符合条件1的,并且i与j的大小没有反转*/
{
j--;/*向前寻找*/
}
a[i] = a[j];
/*找到一个这样的数后就把它赋给前面的被拿走的i的值(如果第一次循环且key是
a[left],那么就是给key)*/
while(i < j && key >= a[i])
/*这是i在当组内向前寻找,同上,不过注意与key的大小关系停止循环和上面相反,
因为排序思想是把数往两边扔,所以左右两边的数大小与key的关系相反*/
{
i++;
}
a[j] = a[i];
}
a[i] = key;/*当在当组内找完一遍以后就把中间数key回归*/
sort(a, left, i - );/*最后用同样的方式对分出来的左边的小组进行同上的做法*/
sort(a, i + , right);/*用同样的方式对分出来的右边的小组进行同上的做法*/
/*当然最后可能会出现很多分左右,直到每一组的i = j 为止*/
}
- 快速排序算法-C语言实现
注:本篇内容为翻译,之所以选择这篇进行翻译原因是该文章含有动画,能够更加直观地展示快速排序.同时,可以仔细看一下代码,代码中把结构化的思想给予了更加充分地表现.按照功能进行模块划分的思想得到了彻底地贯 ...
- 快速排序的一种实现(Mark Allen 数据结构与算法 c语言版)
之前关于快速排序一直比较模糊,网上有几种常见写法: 方法一: void quickSort(int s[], int l, int r) { if (l< r) { int i = l, j = ...
- 数据结构1:数据结构与算法C语言版分析概述
本节开始将带领大家系统地学习数据结构,作为一门计算机专业大二学生的必修课程,该课程面对的目标人群为初步具备基本编程能力和编程思想的程序员(大一接触了 C 语言或者 C++).通过系统地学习数据结构,可 ...
- 交换排序---快速排序算法(Javascript版)
快速排序是对冒泡排序的一种改进.通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行 ...
- 《数据结构与算法(C语言版)》严蔚敏 | 第五章 建立二叉树,并完成三/四种遍历算法
PS:所有的代码示例使用的都是这个图 2019-10-29 利用p126的算法5.3建立二叉树,并完成三种遍历算法 中序 后序 先序 #include<iostream> #include ...
- 【排序】表插入排序算法(C语言版)
排序耗时的操作主要分为两种:查找比较.记录移位. 1.表插入排序 在查找比较基础上,尽量减少记录移位步数,可以令排序操作耗时降低,表插入排序正是为减少移位次数而出现的. 在数据结构上,数据是存储在静态 ...
- 《数据结构与算法(C语言版)》严蔚敏 | 第四章课本案例
//二叉树的顺序存储表示 #define MAXTSIZE 100 typedef TElemtype SqBiTree[MAXTSIZE]; SqBiTree bt; //二叉树的二叉链表存储表示 ...
- 算法分析中最常用的几种排序算法(插入排序、希尔排序、冒泡排序、选择排序、快速排序,归并排序)C 语言版
每次开始动手写算法,都是先把插入排序,冒泡排序写一遍,十次有九次是重复的,所以这次下定决心,将所有常规的排序算法写了一遍,以便日后熟悉. 以下代码总用一个main函数和一个自定义的CommonFunc ...
- 排序算法系列:快速排序算法JAVA版(靠谱、清晰、真实、可用、不罗嗦版)
在网上搜索算法的博客,发现一个比较悲剧的现象非常普遍: 原理讲不清,混乱 啰嗦 图和文对不上 不可用,甚至代码还出错 为了不误人子弟耽误时间,推荐看一些靠谱的资源,如[啊哈!算法]系列: https: ...
随机推荐
- FormatUtil类型格式转换
package cn.edu.hbcf.common.utils; import java.math.BigDecimal; import java.math.BigInteger; import j ...
- VM虚拟机不能上网的问题解决
VM虚拟机不能上网的问题解决 说在前面的话:很多网友看了我的文章后,虚拟机还是不能上网,就联系我帮忙,结果帮他们给弄好后,都说怪自己太粗心,没有仔细看文章.我不是怕网友麻烦我,我是真诚的希望各位要首先 ...
- Linux多条指令之间;和&&
Linux 中经常使用到一个命令,如 make && make install,这里也可以使用 make ; make install,那么在 Linux 中执行命令 ; 和 & ...
- spring-boot启动注解@EnableAutoConfiguration
springboot很多依赖插件是只要有依赖,就会读取相关配置,如果读取不到,就会使用默认的,可能会报错,但是又在项目中不好排除就可以使用 @EnableAutoConfiguration 注解.启动 ...
- js控制button
按钮变灰不可用方法:document.getElementById("crop").setAttribute("disabled", true); 按钮可用方法 ...
- SQL语句大全2
SQL 语句大全 --语 句 功 能 --数据操作 SELECT --从数据库表中检索数据行和列 INSERT --向数据库表添加新数据行 DELETE --从数据库表中删除数据行 UPDATE -- ...
- 栈类Stack
Stack类是Vector类的子类.它向用户提供了堆栈这种高级的数据结构.栈的基本特性就是先进后出.即先放入栈中的元素将后被推出.Stack类中提供了相应方法完成栈的有关操作. 基本方法: publi ...
- java算法-数学之美二
上一章已经说过利用数学思想来解决程序算法问题,实际上就是找规律.这在我们上学时经常遇到,比如给出一段数字,求某一个位置该填写什么数,只要找到规律那就迎刃而解.好了,废话不多说,再来看看案例分析. ...
- (转)java反编译i++和++i问题
转自:http://blog.csdn.net/junsure2012/article/details/7099222 java字节码指令集:http://www.jb51.net/article/3 ...
- oracle游标:查询并打印员工的姓名和薪水
--查询并打印员工的姓名和薪水 --set serveroutput on /* 1.光标的属性 %found:假设取到了记录就是true否则是false: %notfound: */ declare ...