快速排序的java实现

来源:互联网 发布:php授权源码 编辑:程序博客网 时间:2024/05/22 12:55

一、基本思想:

通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。

二、算法介绍:

设要排序的数组是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; 

三、排序演示:

0、假设用户输入了如下数组:

下标012345数据627389
1、创建变量i=0(指向第一个数据), j=5(指向最后一个数据), k=6(赋值为第一个数据的值)。
我们取走了下标0的数据,于是,我们需要找到一个数字来替换他。由于我们要把所有比6小的数移动到左面,所以我们可以开始寻找比6小的数并从右往左找。不断递减j的值,我们发现下标3的数据比6小,于是把3移到下标0。由于变量k已经储存了下标0的数据,所以我们可以放心的把下标0覆盖了。如此一来,下标3虽然有数据,但是相当于没有了,因为数据已经复制到别的地方了。

下标012345数据327389
2、此时,i=0,j=3,k=6。

于是我们再找一个数据来替换他。这次要变成找比k大的了,而且要从前往后找了。递加变量i,发现下标2是第一个比k大的,于是用下标2的数据7替换j指向的下标3的数据,数据状态变成下表:

下标012345数据3277893、此时,i=2,j=3,k=6。
重复上面的步骤,递减变量j。这时,我们发现i和j“碰头”了:他们都指向了下标2。于是,循环结束,把k填回下标2里,即得到结果。

下标012345数据326789
注意:快速排序不会直接得到最终结果,只会把比k大和比k小的数分到k的两边。(你可以想象一下i和j是两个机器人,数据就是大小不一的石头,先取走i前面的石头留出回旋的空间,然后他们轮流分别挑选比k大和比k小的石头扔给对面,最后在他们中间把取走的那块石头放回去,于是比这块石头大的全扔给了j那一边,小的全扔给了i那一边。只是这次运气好,扔完一次刚好排整齐。)为了得到最后结果,需要再次对下标2两边的数组分别执行此步骤,然后再分解数组,直到数组不能再分解为止(只有一个数据),才能得到正确结果。

四、示例代码:

public class QuickSort {public static void main(String[] args) {int[] arr={6,2,7,3,8,9,3,4,8,4,2,4};quickSort(arr,0,arr.length-1);printArray(arr);}//打印数组public static void printArray(int[] arr) {for (int i = 0; i < arr.length; i++) {System.out.print(arr[i]+" ");}System.out.println();}//递归实现快速排序public static void quickSort(int[] arr,int start,int end){if(start<end){int middle=getMiddle(arr,start,end);quickSort(arr,start,middle-1);quickSort(arr,middle+1,end);}}//获取中轴值private static int getMiddle(int[] arr,int start,int end){int key=arr[start];while(start<end){while(start<end&&arr[end]>=key)end--;if(start<end){arr[start]=arr[end];start++;}while(start<end&&arr[start]<=key)start++;if(start<end){arr[end]=arr[start];end--;}}arr[start]=key;return start;}}

五、延伸阅读:快速排序的其他实现方式

1、java 中提供的默认的快速排序的实现

2、JAVA快速排序(高效)

3、快速排序Java代码

4、快速排序算法java


0 0
原创粉丝点击