• 快排--java实现


    快速排序思想

      快速排序的思想,寻找一个轴位,比这个轴小的放到左边,比这个轴大的放到右边,然后分别再对两边进行如此的方法即可得到排序的数组。

      这样说起来晦涩难懂,我们举个例子来实现。

      例如数组:{13,19,9,5,12,8,7,4,21,2,6,11},选取末位11为轴,

      第一次遍历得到:{13,19,9,5,12,8,7,4,21,2,6,11}

      第二次遍历得到:{13,19,9,5,12,8,7,4,21,2,6,11}

      第三次遍历得到:{9,19,13,5,12,8,7,4,21,2,6,11}

      第四次遍历得到:{9,5,13,19,12,8,7,4,21,2,6,11}

      第五次遍历得到:{9,5,13,19,12,8,7,4,21,2,6,11}

      第六次遍历得到:{9,5,8,19,12,13,7,4,21,2,6,11}

      第七次遍历得到:{9,5,8,7,12,13,19,4,21,2,6,11}

      第八次遍历得到:{9,5,8,7,4,13,19,12,21,2,6,11}

      第九次遍历得到:{9,5,8,7,4,13,19,12,21,2,6,11}

      第十次遍历得到:{9,5,8,7,4,2,19,12,21,13,6,11}

      第十一次遍历得到:{9,5,8,7,4,2,6,12,21,13,19,11}

      最后我们把原来的轴11与中间位置12交换得到:{9,5,8,7,4,2,6,11,21,13,19,12}

      我们开始排列两边,{9,5,8,7,4,2,6} 和{21,13,19,12}

      我们选取6和12分别为两边的轴,开始新的一轮遍历,

      第一次遍历:{9,5,8,7,4,2,6}  ,   {21,13,19,12}

      第二次遍历:{5,9,8,7,4,2,6}  ,  {21,13,19,12}

      第三次遍历:{5,9,8,7,4,2,6}  ,  {21,13,19,12}

      第四次遍历:{5,9,8,7,4,2,6}  ,  无

      第五次遍历:{5,4,8,7,9,2,6}  ,  无

      第六次遍历:{5,4,2,7,9,8,6}  ,  无

      最后我们把原来的轴6和中间位置7交换,得到:{5,4,2,6,9,8,7}   。把原来的轴12和中间位置21交换,得到:{12,13,19,21}

      我们分成了小数组:{5,4,2} 和{9,8,7} 和{13,19,21},分别以2和7,21为轴进行新一轮的遍历

      第一次遍历:{5,4,2}  ,  {9,8,7}  ,  {13,19,21}    注意:13和13自己进行交换,

      第二次遍历:{5,4,2}  ,  {9.8.7}  ,  {19,13,21}    

      最后我们把原来的轴2和中间位置5交换,得到:{2,4,5}。把原来的轴7和中间位置9交换,得到:{7,8,9}。把原来的轴21和中间位置21交换,得到{19,13,21}

      我们分成小数组:{2,4}和{7,8}和{19,13},分别以4,8,13为轴,开始新的一轮遍历。

      第一次遍历:{2,4}  ,  {7,8}  ,  {19,13}

      这里已经结束遍历,原来的轴和中间位置交换,得到{2,4}     {7,8}    {13,19} 。 自此遍历结束,得到了顺序的数组。

      注意:(1)这里的“中间位置”,并不是说的位置上的中间,而是指的是轴的中间位置,也就是说,这个中间位置是左边的比轴小,右边的比轴大!!!

         (2)这里的红色标志表示交换,如果是有一个红色的表示自己和自己交换!!!

    java代码实现

      程序员还是用代码来说事,这么多文字,大家可能会看不下,那就看下代码,不明白的可以对照上面的顺序来屡屡。

     1 /**
     2      * 快排
     3      * @param arr
     4      * @param low
     5      * @param high
     6      */
     7     private void quickS(int[] arr,int low,int high){
     8 
     9         if(low > high){
    10             return;
    11         }
    12         int mid = getMid(arr,low,high);
    13         quickS(arr,low,mid-1);
    14         quickS(arr,mid+1,high);
    15     }
    16 
    17     /**
    18      * 获取中间位置
    19      * @param arr  待排序的数组
    20      * @param low   最低位置
    21      * @param high  最高位置
    22      * @return
    23      */
    24     private int getMid(int[] arr,int low,int high){
    25         if(low > high){
    26             return -1;
    27         }
    28         int max = arr[high];
    29         int i = low;
    30         int temp = 0;
    31         while(low < high){
    32             if(max > arr[low]){
    33                 temp = arr[i];
    34                 arr[i]=arr[low];
    35                 arr[low]=temp;
    36                 i++;
    37             }
    38             low++;
    39         }
    40         temp = arr[i];
    41         arr[i] = arr[high];
    42         arr[high] = temp;
    43         return i;
    44     }
    45 
    46     @Test
    47     public void testQS(){
    48         int arr[]={13,19,9,5,12,8,7,4,21,2,6,11};
    49         quickS(arr,0,11);
    50         for(int i = 0; i < arr.length; i++){
    51             System.out.print(arr[i]+"   ");
    52         }
    53     }

    附上另一种方法:

    /**
         * 快排
         * @param array
         */
        private void quickSort(int[] array){
            int high = array.length-1,low=0;
            subSort(array,high,low);
            for(int i = 0; i<array.length; i++){
                System.out.println(array[i]);
            }
        }
    
        private int getMiddle(int[] array,int high,int low){
    
            int key = array[low];
            while (low < high) {
                while (low < high && array[high] >= key){
                    high--;
                }
                array[low] = array[high];
                while (low < high && array[low] <= key){
                    low++;
                }
                array[high] = array[low];
            }
            array[low] = key;
            return low;
        }
    
        private void subSort(int[] array,int high,int low){
            if(low>high){
                return;
            }
            int result = getMiddle(array, high, low);
            subSort(array,result - 1,low);
            subSort(array, high,result + 1);
        }

    总结

      快速排序主要是掌握方法,其中获取中间位置的算法是核心算法,这里是排序的关键,做什么事情势必要亲身尝试,哪怕错了可以重头再来!!!

      

      

  • 相关阅读:
    Behavior Targeting 技术研究
    LINQ的Distinct总结
    当为业务逻辑层(BLL,Service)提供基类之后,程序变得了更加面向对象了
    MVC中,查询以异步呈现,分页不用异步的解决方案
    基础才是重中之重——面向抽象编程(抽象类的多态性)
    基础才是重中之重——派生类集合与基类集合可以相互转换吗?
    让你的 Nginx 的 RTMP 直播具有统计某频道在线观看用户数量的功能
    转发一个最新HEVCH.265码流分析软件
    PHP性能优化大全(整理)
    “灭”了国外的mini sql !
  • 原文地址:https://www.cnblogs.com/lixiaochao/p/10029968.html
Copyright © 2020-2023  润新知