zoukankan      html  css  js  c++  java
  • 用java方式实现快速排序

    一、基本思想

      快速排序采用分治的策略,具体如下:选择一个关键值作为基准值,找到一个元素小于比基准值小的都在左边序列(一般是无序的),比基准值大的都在右边(一般是无序的)。一般选用序列第一个元素作为基准值,由序列的最后一个元素从后往前扫描序列,找到一个元素值小于基准值,就将这二个值交换,然后由序列的第一个元素从前向后扫描序列,找到一个元素大于基准值,然后交换这二个值,直到从前到后的扫描索引大于等于从后到前的扫描索引。这时基准数的左边小于基准数,右边大于基准数。然后按照上述方式递归基准数左右二边的子序列,直到子序列大小为1或0,整个序列就有序了。快速排序的平均空间复杂度为O(nlog2n),时间空间度为O(1),快速排序是不稳定的排序。

    二、图解

    三、代码实现

    public class JavaSort {
        public static void main(String[] args) {
            int a [] =new int []{3,1,5,2,4};
            System.out.println("排序前的数组:"+Arrays.toString(a));
            fastSort(a, 0, a.length-1);
            
            System.out.println("排序后的数组:"+Arrays.toString(a));
        }
        
        /**
         * 
         * @param ary 未排序数组
         * @param before (子)序列最前面的索引
         * @param after  (子)序列最后面的索引
         */
         public static void fastSort(int[] ary,int before,int after ) {
             int begin = before;
             int end = after ;
             int key = ary[before];
             while(end>begin){
                 //从后往前比较
                 while(end>begin&&ary[end]>=key)  //如果没有比关键值小的,比较下一个,直到有比关键值小的交换位置,然后又从前往后比较
                     end--;
                 if(ary[end]<=key){
                     int temp = ary[end];
                     ary[end] = ary[begin];
                     ary[begin] = temp;
                 }
                 //从前往后比较
                 while(end>begin&&ary[begin]<=key)//如果没有比关键值大的,比较下一个,直到有比关键值大的交换位置
                    begin++;
                 if(ary[begin]>=key){
                     int temp = ary[begin];
                     ary[begin] = ary[end];
                     ary[end] = temp;
                 }
             }
             //此时第一次循环比较结束,关键值的位置已经确定了。左边的值都比关键值小,右边的值都比关键值大,但是两边的顺序还有可能是不一样的,进行下面的递归调用
    
             //递归关键值左右二边的子序列
             if(begin>before) {
                 fastSort(ary,before,begin-1);//递归左边子序列。
    
             }
             if(end<after ) {
                 fastSort(ary,end+1,after );//递归右边子序列。
             }
         }
    }

    运行结果:

  • 相关阅读:
    Convert、Parse、TryParse、(int)区别及可能引发性能问题
    重写、覆盖、重载、多态几个概念的区别分析
    计算机系统的硬件组成(转)
    如何选择Html.RenderPartial和Html.RenderAction
    位运算(转)
    Java程序员面试中的多线程问题
    请转到控制面板来配置或安装系统组件
    开篇
    DropDownList 不能有多个项被选定!
    有关rollup和cube的使用方法讨论
  • 原文地址:https://www.cnblogs.com/shareAndStudy/p/12459125.html
Copyright © 2011-2022 走看看