快速排序的过程java

来源:互联网 发布:sql server2008免费版 编辑:程序博客网 时间:2024/05/16 09:29


快速排序是一种效率比较高的算法。但是在网上学习的时候,发现很多解释和算法的实际过程对不上,所以呢自己细心研究了一下过程,供初学者参考。



一般的做法是选取数组最左端的数字为key,也就是比较的对象,将比key小的放到它的左边,比key大的放到它的右边,然后对左边和右边分别进行相同的做法。比如看这个例子,我们要排序的数组是{34792},首先将最左边的3作为key,第一步想要得到结果是把小于3的数字,也就是2,放到3的左边,把大于3的,也就是479,放到3的右边,479这三个数字的顺序无所谓(Fig.1)。第一次用,不知道怎么调图片大小,见谅。


实现的方法是:有左右两个指针,leftrightleft对应数组最左端的数字,right对应数组最右端的数字(Fig.1)。首先从右端看起,因为右端是要放比3大的数字,所以碰到比3小的数字我们要移动到左边,比如,right对应的是2,我们要把它移到左边去,那么移到哪个位置呢,就是left现在所在的位置,移动后的数组就变成了Fig.2所示。


网上一般的写法是交换32的位置,变成{ 24793 },但实际上代码过程里并没有体现交换的过程,那么3去哪里了呢,不要急,3还在key那里呢,最后赋值就会回来了。这里实现的代码是array[left]=array[right]。接下来,我们从左端看起,寻找比3大的数,left移到了4所在的位置(见Fig.3



那么我们要把4移到右边去,移到哪里呢,移到现在right的位置,就变成了Fig.4所示



然后再看,右边,因为right所对应的数字要比3小,而4>3,right左移一位,9大于3,再左移,7大于3,再左移,当leftright相遇的时候,我们就不用进行下去了,因为left是从左往右移动的,将对应的大于3的数字移到了右边,所以left左边的都是小于3的数字,而right右边都是大于3的数字,所以此时只要将我们的key,也就是3,放在现在right的位置就行了,也就是将right对应的4变为3,所以就变成了{23794},这就是我们想要的结果。

第一步完了之后,接下来就是递归了,和很多的文章都是一样的,我们将3左边的,也就是{2},和右边的,也就是{794},分别重复同样的方法,2就一个数,不用排,右边的{7,9,4},7作为key,右边的4小于7,要放到左边,变为了{494}left往右移动,9大于7,放到右边,变为了{499},然后leftright相遇,将key的值放进去,就变成了{479},到这里再递归分下去左右都是一个数,就不用排了,于是得到了我们想要的结果{23479}。程序在最后面。




package PaiXu;public class KuaiSuPaiXu {    public static void main(String[] args){         int [] array =new int[]{3,4,7,9,2};     for(int i=0;i<array.length;i++){     System.out.print(array[i]+" ");     }     KuaiSuPaiXu a=new KuaiSuPaiXu();     System.out.print("\n");     a.sort(array, 0, array.length-1);     for(int j=0;j<array.length;j++){     System.out.print(array[j]+" ");     }         }//固定切分public static int partion(int[] array ,int left, int right){int key =array[left];while(left<right){while(array[right]>=key&&right>left){right--;}array[left]=array[right];//将右边小于key的放到左边while(array[left]<=key&&right>left){left++;}array[right]=array[left];//将左边大于key的放到右边}array[right]=key;return right;}public void sort(int[] array, int left,int right){if(left>=right){return;}int index=partion(array,left,right);sort(array,left,index-1);sort(array,index+1,right);}}