该方法的基本思想是:
1.先从数列中取出一个数作为基准数。
2.分区过程,将比这个数大的数全放到它的右边,小于或等于它的数全放到它的左边。
3.再对左右区间重复第二步,直到各区间只有一个数。
以上的就是思想,在看了这个视频:http://www.iqiyi.com/v_19rrhzyeqs.html,我学着写了一段脚本,脚本如下
public class QuickSort { public static void main(String[] args){ int[] a={12,22,11,3,13,45,6,33,22,5,6,2,1,12}; show(a); sort(a, 0, a.length - 1); show(a); } public static void show(int a[]){ for(int i=0;i<a.length;i++) System.out.print(a[i] + " "); System.out.println(); } public static void sort(int[] a, int begin, int end){ if(end-begin<=1)//当比较区间小于等于1的时候就不排序了 return; int key=a[begin]; int p1=begin; int p2=end; boolean bool=true;//默认为true的时候从右向左比较 L1: while (p1<p2){ if(bool){ for(int i=p2;i>p1;i--){ if(a[i]<=key){ a[p1]=a[i]; p1++; p2=i; bool=false; continue L1; } } p2=p1; }else { for(int i=p1;i<p2;i++){ if(a[i]>=key){ a[p2]=a[i]; p2--; p1=i; bool=true; continue L1; } } p1=p2; } } a[p1]=key; sort(a, begin, p1 - 1); sort(a, p1 + 1, end); } }
但是执行的结果为
12 22 11 3 13 45 6 33 22 5 6 2 1 12 1 2 3 5 6 6 11 12 12 22 13 22 45 33
奇怪的是,思路是没有错误的,但是为什么结果却是不对,还在研究中,于是我就思考,实在想不出来,就随便写了个数据,然后手动排序,终于被我发现问题了,原来是视频中的脚本有误,排序的一开始考虑了当if(end-begin<=1)的时候就return,停止执行脚本,其实是不对的
打个比方,有个数组:3,4,1,2,0,当进行第一轮排序后的结果为:0,2,1,3,4;然后在第二轮排序后的结果为:0,2,1,3,4,发现没,此时数组中剩下2和1没有排序,如果按照以上的想法,end-begin=1-1=0,就不排序了,这个就不对了,因为2确实比1大,需要调换位置的,这个就是问题所在,脚本一开始的判断就是错误的,所以只要将开始的条件改为if(end-begin<0) return;那么排序就正确了,如下
12 22 11 3 13 45 6 33 22 5 6 2 1 12 1 2 3 5 6 6 11 12 12 13 22 22 33 45
然后继续在百度,看下其他网友是如何写的,于是看到这个文章:http://www.cnblogs.com/morewindows/archive/2011/08/13/2137415.html,这篇文章写的内容,比上门那个链接说的更加好懂,所写的脚本也是更加简洁,于是,我就参考这个脚本,再次写了脚本,如下
public class QuickSort { public static void main(String[] args){ int[] a={12,22,11,3,13,45,6,33,22,5,6,2,1,12}; show(a); sort(a, 0, a.length - 1); show(a); } public static void show(int a[]){ for(int i=0;i<a.length;i++) System.out.print(a[i] + " "); System.out.println(); } public static void sort(int[] a, int begin, int end) { if (end - begin <0) return; int key = a[begin]; int pStart = begin; int pEnd = end; while (pStart<pEnd){ while (pStart<pEnd&&a[pEnd]>=key) pEnd--; if(pStart<pEnd) { a[pStart]=a[pEnd]; pStart++; } while (pStart<pEnd&&a[pStart]<key) pStart++; if(pStart<pEnd) { a[pEnd]=a[pStart]; pEnd--; } } a[pStart]=key; sort(a,begin,pStart-1); sort(a,pStart+1,end); } }
这样脚本看来就更好懂了,以上就是学习快速排序的过程