zoukankan      html  css  js  c++  java
  • 小白懂算法之快速排序

    一.快速排序介绍

      快速排序(Quick Sort)概念:是由冒泡排序改进而得到的。在冒泡排序过程中,只对相邻的两个记录进行比较,因此每次交换两个相邻记录时只能消除一个逆序。如果能通过两个(不相邻)记录的一次交换,消除多个逆序,则会大大加快排序的速度。快速排序方法中的一次交换可以消除多个逆序。

    二.算法原理

      快速排序的算法原理:在待排序的n个记录中任取一个记录(通常取第一个记录)作为基准数(与其他记录比较的数),设其关键字为pivotkey。经过一趟排序后,把所有关键字小于pivotkey的记录交换到前面,把所有关键字大于pivotkey的记录交换到后面,结果将待排序记录分成两个子表,最后将基准数放置在分界处的位置。然后,分别对左右子表重复上述过程,直至每个子表只有一个记录时排序完成。

    三.实现代码(Java实现)

        public static void FastSort(int[] arr,int i,int j) {
            /**
             *     实现思路:
             *         在数组随便选择一个作为基准数,默认是数组第一个
             *         需要两个伪指针指向在数组两边的元素并向内逐一与基准数比较
             *         左边指针 为 left 专门查找比基准数大的数,右边指针 right 专门查找比基准数小的数
             *         若left>right则逻辑不成立
             *         在满足left<right的情况下,left和right且找到了满足值,则进行交换
             *         当left和right重合或者left>right时就不再查找了,将基准数归位,即放到一个分界点位置,左边数小于基准数,右边大于基准数
             *         递归调用本函数,重新设定指针left,right的所指的位置
             * 
             *         下面注释所说的指针只是方便解释!
             */
            if(i>j) return;
            
            int left = i;    //left为左指针
            int right = j;    //right为右指针
            int temp = arr[i];    //临时保存基准数
            
            while(left < right) {    //满足left < right,即可开始下一轮的查找
    
                while(arr[right] >= temp && left < right) {    //当右指针所指的数比基准数大且left < right,查找下一个
                    right--;
                }
                
                while(arr[left] <= temp && left < right) {    //当左指针所指的数比基准数小时且left < right,查找下一个
                    left++;
                }
                
                if(left < right) {    //当左边位置<右边位置时,就交换数值
                    int t = arr[left];
                    arr[left] = arr[right];
                    arr[right] = t;
                }
                
            }
            
            //将基准数归位到分界点,这里的分界点位置以left或者right都行。
            arr[i] = arr[left];
            arr[left] = temp;
            
            FastSort(arr,i,left-1);    //基准数两边递归调用
            FastSort(arr,left+1,j);
            
        }

      强调:

        1.在上面代码的情况,实际上不可能会出现left > right的情况,都是在left = right的时候,不满足left<right而while就终止掉了;你看上面的代码都加了left<right的判断,你不信自己尝试下。

        2.记住如果基准数在数组的左边,那么必须从right先开始,因为从right先开始就能保证right右测的数一定是大于基准数的,到时候left和right处在同一个位置时,此位置的右边一定是比基准数大的;具体原因还是因为受left<right这个条件的限制,可以自己debug看下整个过程。

      main方法测试:

        public static void main(String[] args) {
            //创建一个无序数组
            int[] arr = new int[] {2,3,1,4,5,7,6,8,10,9};
            //调用快速排序方法,返回一个排序后的方法
            FastSort(arr,0,arr.length-1);
            
            //遍历数组
            System.out.print("最终结果:");
            for(int i=0;i<arr.length;i++) {
                System.out.print(arr[i]+" ");
            }
            
        }

      OK,如果有任何疑问可在下面留言!

  • 相关阅读:
    EF4.3 到底能不能用?
    系统架构师(详解+转)
    silverlight MD5加密
    silverlight自定义安装客户端插件
    vs2010中文安装英文版silverlight5,和MVC 3
    如何自定义gridview的表格显示?
    Scott Mitchell的ASP.NET2.0数据指南中文版索引
    成功软件开发者的9种编程习惯(一)
    第8章 商品目录管理
    6/29 项目目录结构有所调整
  • 原文地址:https://www.cnblogs.com/ibcdwx/p/13976792.html
Copyright © 2011-2022 走看看