• 关于快速排序的学习


    该方法的基本思想是:

    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);
        }
    }
    

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

  • 相关阅读:
    c# 图像转化成灰度图
    文件操作 流
    GBK UTF8 GB2312 流
    助力奥巴马,拯救大气层
    ASP.NET 缓存技术
    GridView 和 ViewState 来实现条件查寻
    把日期按指定格式输出
    创业灵感淘宝网
    文件_上传_下载
    java23种设计模式与追MM
  • 原文地址:https://www.cnblogs.com/xxyBlogs/p/4948340.html
Copyright © 2020-2023  润新知