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

总结

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

  

 

  

posted @ 2018-11-28 01:07  墨瞋  阅读(332)  评论(0编辑  收藏  举报