我去去去的,搞个快速排序搞了那么长时间,看百度百科里面的解释,真是不知道是我理解能力低呢,还是我真的很笨...哎,总之是我的原因,哈哈~再来仔细分析一下快速排序:
以下是百度百科中的解释:
"
设要排序的数组是A[0]……A[N-1],首先任意选取一个数据(通常选用第一个数据)作为关键数据,然后将所有比它小的数都放到它前面,所有比它大的数都放到它后面,这个过程称为一趟快速排序。整个排序就是一个递归的过程.
一趟快速排序的算法是:
1)设置两个变量I、J,排序开始的时候:I=0,J=N-1;
2)以第一个数组元素作为关键数据,赋值给key,即 key=A[0];
3)从J开始向前搜索,即由后开始向前搜索(J=J-1),找到第一个小于key的值A[J],并与A[I]交换;
4)从I开始向后搜索,即由前开始向后搜索(I=I+1),找到第一个大于key的A[I],与A[J]交换;
5)重复第3、4、5步,直到 I=J; (3,4步是在程序中没找到时候j=j-1,i=i+1,直至找到为止。找到并交换的时候i, j指针位置不变。另外当i=j这过程一定正好是i+或j-完成的最后另循环结束。)
"
其中,我读了老长时间没有读懂第三步和第四步的意思...
现在来总结一下:首先,快速排序的思想,就是取数组中某个数作为pivot,这里用最右边的那个吧,然后剩下的先分一下类,怎么分呢?这样分:分成左右两个部分,左边的要比这个pivot小(或者大),右边的要比这个pivot大(或者小),然后,把这个pivot插入到左右部分的中间,这样呢,就完成了一次排序,然后判断一下进行递归排.额...不知道说清楚没有,反正就是这个样子啦.
要实现这个思路,要想想用什么办法呢,用什么办法呢,用什么办法呢?一?有了,这样吧,肯定是循环啦,在循环中,有两个标签,一个是在左边晃,一个是在右边晃,左边的要从头往右找,找到大于那个pivot的值以后,好,停下,等着右边找,等右边从右往左找到比pivot小的值后,也停下,这样,都知道了是该交换了.
那么,循环里面就要先让左边标签动,如果这次不行的话,就应该+1,并且其他的不执行任何操作,右边循环的时候同理,因此,我们应该安排一个continue来控制+1后赶紧跳出去.只有左边和右边都不continue了,才到了两个要交换的时候.
恩恩,核心的思路就应该是这样的.
还有一个值得注意的是,当左边的标签和右边的标签重叠的时候,就应该是跳出循环的时候了,但是,跳出后还是要判断一下当前这个标签指向的值是大于pivot还是小于pivot,如果是小的话,那可不能换,还要继续往右走.
最后才去交换pivot和这个标签.
这样呢,就完成了一次循环.下面就是进行判断是不是要递归了.要注意的是,判断的条件了.
好啦,啰嗦完了,放上代码,欢迎扔砖,嘻嘻~
(*^__^*) 嘻嘻……come on!
分享到:
相关推荐
最快的排序算法 谁才是最强的排序算法:快速排序-归并排序-堆排序,排序算法数据结构
1、掌握快速排序随机算法的设计思想与方法。 2、熟练使用高级编程语言实现不同的快速排序算法。...快速排序是算法导论中的经典算法。在本实验中,给定一个长为 n 的整数数 组,要求将数组升序排序。
快速排序是一种高效的排序算法,它基于分治法的思想。在这个教程中,我们将深入探讨快速排序的工作原理,并提供一个Java示例来演示如何实现它。无论您是新手还是有经验的Java开发者,通过学习这个算法,您将获得一个...
快速排序算法的编码和优化 快速排序的基本思路是: 1. 先通过第一趟排序,将数组原地划分为两部分,其中一部分的所有数据都小于另一部分的所有数据。原数组 被划分为2份 2. 通过递归的处理, 再对原数组分割的两...
排序是计算机科学中最重要的研究问题之一。" 年被列为" 世纪对科学和工程计算的研究与实 ...并对快速排序算法和堆排序算法进行了比较,理论和实验结果表明,快速排序算法仍然是目前最好的排序算法之一。
六种内部排序算法比较:直接插入排序、希尔排序、冒泡排序、快速排序、选择排序、堆排序。包含实验报告和源代码设计。
快速排序是对冒泡排序的一种本质改进。它的基本思想是通过一趟 扫描后,使得排序序列的长度能大幅度地减少。在冒泡排序中,一次 扫描只能确保最大数值的数移到正确位置,而待排序序列的长度可能只 减少1。快速...
经典排序算法 - 快速排序Quick sort 经典排序算法 - 桶排序Bucket sort 经典排序算法 - 插入排序Insertion sort 经典排序算法 - 基数排序Radix sort 经典排序算法 - 鸽巢排序Pigeonhole sort 经典排序算法 - ...
快速排序算法的基本思想是:随机选取数组中的一个值,将所要进行排序的数分为左右两个部分,其中一部分的所有数据都比另外一部分的数据小,然后将所分得的两部分数据进行同样的划分,重复执行以上的划分操作,直到...
不稳定的排序算法:快速排序、希尔排序、堆排序、选择排序(简简记记::快快些些选选堆堆) 所需辅助空间最多:归并排序 所需辅助空间最少:堆排序 平均速度最快:快速排序 当n较大,则应采用时间复杂度为O(nlogn)的...
1、熟悉快速排序的串行算法 2、熟悉快速排序的并行算法 3、实现快速排序的并行算法 3.2 实验环境及软件 单台或联网的多台PC机,Linux操作系统,MPI系统。 3.3实验内容 1、快速排序的基本思想 2、单处理机上快速...
排序算法演示:插入排序、选择排序、冒泡排序、希尔排序、归并排序、快速排序
JAVA排序算法: 直接插入,希尔排序,选择排序,堆排序,冒泡排序,快速排序,归并排序,包括算法的详细介绍,以及对几种算法的详细测试
内容为:用户可确定排序的具体数目N,程序产生N个随机数,利用快速排序和冒泡排序法分别对随机数排列。比较快速排序算法与冒泡排序时间。
1.快速排序的思想 先从数列中取出一个数作为基准数(简单起见就选第一个数) 分区过程:将比这个数大的数全放到他的右边,比他小的数全放到他的左边(分治) 再对左右两边的区重复第一步和第二部操作,直到各区间...
选择排序 冒泡排序 插入排序 合并排序 快速排序算法原理及代码实现 不同排序算法时间效率的经验分析方法 验证理论分析与经验分析的一致性 当面临巨大数据量的排序的时候,还是优先选择合并排序算法和快速排序算法。...
C# 常用经典算法,选择排序 冒泡排序 快速排序 插入排序 希尔排序
之前说过轴的选择是快速排序法的效率关键之一,在这边的快速排序法的轴选择方式更加快了快速排序法的效率,它是来自演算法名书 Introduction to Algorithms 之中。
快速排序法(quick sort)是目前所公认最快的排序方法之一(视解题的对象而定),虽然快速排序法在最差状况下可以达O(n2),但是在多数的情况下,快速排序法的效率表现是相当不错的。 快速排序法的基本精神是在数列中...
快速排序