该方法的基本思想是:
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);
}
}
这样脚本看来就更好懂了,以上就是学习快速排序的过程