关于快速排序的学习

该方法的基本思想是:

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,34,发现没,此时数组中剩下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);
    }
}

 这样脚本看来就更好懂了,以上就是学习快速排序的过程

原文地址:https://www.cnblogs.com/xxyBlogs/p/4948340.html