排序算法之----快速排序(快速上手快速排序)
何为快速排序算法?
快速排序的基本思想又是什么?
其实很简单:
快速排序的基本思想是
1、先从数列中取出一个数作为基准数(这里我们的算法里面取数组最右边的元素作为基准数,节省了一个变量 0。0)
2、分区过程,将比这个数大的数全放到它的右边,小于或等于它的数全放到它的左边
3、再对左右区间重复第二步,直到各区间只有一个数(这里涉及到一个递归的过程)
题外话说一句(快速排序有两种:一种是标准快速排序;一种是随机快速排序,后面会讲到0.0)
首先,在实现对数组排序之前,我们先来实现一个小目标,将小于等于数组最右边的元素放在左边;大于数组最右边的元素放在右边。(透露一个小秘密,不知道你有没有发现,如果这样不断循环递归下去的话,当左右两边都只剩一个元素的时候,数组已经排好序了0。0)
行,那现在让我们来实现我们的小目标:
就是所谓的patition过程:
定义两个指针L和R,定义两个区域Less和More,
具体过程如下图所示:
(不好意思,时间问题,写的有点简陋,有疑问的可以直接在下面留言哦0。0)
下面附上程序源码:
// 理解了快速排序的具体原理或者说具体操作,实现起来不是很难,定义两个缓存变量,
// 两个指针通过传参得到。要对过程很清晰,>arr[R]怎么样,<arr[R]怎么样,等于又怎么样
最后记得将大于区域最后一个数与大于区域最左边的数进行交换,即arr[R]与arr[more]
有了这个patition过程,快排的基本功能已经实现了
下面是整体的排序:
其中,24行这样做其实就省去了在测试时提供要排序的下标的步骤,直接全排(因为我们这个函数实现的是给定任何两个下标, 就可以对下标范围之间的元素进行排序了)
30行这里就体现了随机快速排序和标准快速排序的区别了,这里在L和R之间随机选择一个数与最后一个数位置交换,包含概率因素,使其平均时间复杂度就变小了,34和35行就是递归过程了。
另外用eclipse提供的方法来比较自己的算法是否正确: