<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    ALL is Well!

    敏捷是一條很長的路,摸索著前進著

      BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
      30 隨筆 :: 23 文章 :: 71 評論 :: 0 Trackbacks

    本文為原創,歡迎轉載,轉載請注明出處BlogJava
    快速排序的算法思想:
    快速排序采用了分治的策略,將原問題分解為若干個規模更小但結構與原問題相似的子問題。用遞歸方法解決子問題,然后將這些子問題的解組合為原問題的解。

    快速排序的程序的一般過程可簡單描述為:
    1.用統一的方法取得 pivot(軸)。
    2.根據pivot 對已有數組進行排序
        1) 將array[pivot]存儲在tmp變量中,作為比較基準。
        以low、high分別從前向后、從后向前遍歷數組
        2) 從后向前遍歷,找到第一個小于tmp的數,將其移動到low的位置。
        3) 從前向后遍歷,找到第一個大于tmp的數,將其移動到high的位置。
        4) 循環2、3步,直到兩指針重疊(即退出循環的條件是 low >= high),將tmp移動到low(此時low與high重合)的位置,并將low返回成為新的pivot。
        5) 根據4步返回的pivot,對已有數組進行劃分,0~pivot-1 和 pivot+1 ~ array.lenght,遞歸1~5步。直到調用退出。

    相信對于以上理論大家一定是耳熟能詳了,但理解起來還是比較抽象,下面我就用Excel畫圖簡單的描述一下 快速排序 的過程。

    假設我們要寫一個程序對已有數組進行排序,簡單起見,設定待排序數組為 int[] array = { 4, 2, 1, 7, 5, 3, 8, 6 }。對其用快速排序算法進行排序,過程描述如下:
    1.根據已有待排序數組,取得pivot,我在這里取得pivot的策略就是 取 數組的第一個數,這里即為 4。
       tmp = 4;

    待排序數組:黃色底色表示pivot。



    2.從后向前移動high,找到第一個小于tmp的數,則將該數移動到low的位置。



    3.從前向后移動low,找到第一個大于tmp(4)的數,將其移動到high的位置。


    4.然后再向前移動high,試圖找到第一個小于tmp(4)的數,但沒有找到,此時low與high重疊,將tmp的值放入low的位置,并將low作為pivot返回。




      根據新的pivot進行遞歸調用,將原待排序數組 分解為兩塊,index區間分別為0~2,4~7,即以下兩個子數組
      (并未新建數組,只是只關注這個區間的數據,對其進行排序,也就是將問題分解為兩個小的子問題,但問題很類似。)
     

    這兩個數組的排序過程這里就不畫了,一樣的過程。

    下面來看看實現的代碼,與剛剛的過程描述是符合的:

    package com.bz.sort.algorithm;

    public class QuickSort {
        
    /**
         * 對外調用的方法入口。
         * 
    @param array 待排序數組
         
    */

        
    public void sort(int[] array) {
            
    if (array == null || array.length < 0{
                
    throw new RuntimeException("待排序數組中無數據。");
            }


            
    // 排序
            sort(array, 0, array.length - 1);
        }


        
    /**
         * 快速排序。
         * 
    @param arr 待排序數組
         * 
    @param left 關注的區間
         * 
    @param right 關注的區間
         
    */

        
    private void sort(int[] arr, int left, int right) {
            
    if (left >= right) {
                
    return;
            }

            
    // 取得pivot位置,這里的策略是取得最小的index,即返回left
            int pivot = findPivot(arr, left, right);
            
    // 排序并重新計算出pivot
            pivot = partion(arr, left, right, pivot);

            
    // 以pivot為中心將原數組分解成兩塊,遞歸排序
            sort(arr, left, pivot - 1);
            sort(arr, pivot 
    + 1, right);
        }


        
    /**
         * 排序并返回新的pivot
         * 
    @param arr 待排序數組
         * 
    @param left 區間
         * 
    @param right 區間
         * 
    @param pivot 軸
         * 
    @return 
         
    */

        
    private int partion(int[] arr, int left, int right, int pivot) {
            
    int tmp = arr[pivot];
            
    int low = left;
            
    int high = right;
            
    while (low < high) {
                
    // 從后向前遍歷數組,找到第一個小于arr[pivot]的數
                while (low < high && tmp < arr[high]) {
                    high
    --;
                }

                arr[low] 
    = arr[high];

                
    // 從前向后遍歷數組,找到第一個大于arr[pivot]的數
                while (low < high && tmp >= arr[low]) {
                    low
    ++;
                }

                arr[high] 
    = arr[low];
            }


            
    // 此時low與high重合,將tmp的值移動到low的位置
            arr[low] = tmp;
            
    // 將low當作新的pivot返回
            return low;
        }


        
    /**
         * 取得排序的軸
         * 
    @param array
         * 
    @return
         
    */

        
    protected int findPivot(int[] array, int left, int right) {
            
    if (array == null || array.length < 0{
                
    throw new RuntimeException("待排序數組中無數據。");
            }

            
    // 選擇第一個元素為軸
            return left;
        }

    }

     


    測試代碼如下:

    package com.bz.sort.algorithm;

    import org.junit.Test;

    import junit.framework.Assert;

    public class QuickSortTest {
        @Test
        
    public void testSort() {
            
    int[] array = 42175386 };
            QuickSort qs 
    = new QuickSort();
            qs.sort(array);
            
    for (int i = 0; i < array.length - 1; i++{
                Assert.assertTrue(array[i] 
    <= array[i + 1]);
            }

        }

    }


    注:此代碼只為 演示 排序過程。
    posted on 2011-04-09 17:37 李 明 閱讀(2069) 評論(1)  編輯  收藏 所屬分類: Java

    評論

    # re: 詳細描述 快速排序 的過程 附Java實現 2016-03-17 14:07 哥哥
    誤人子弟啊!  回復  更多評論
      

    主站蜘蛛池模板: 亚洲国产高清在线精品一区| 亚洲国产精品免费观看| 亚洲精品乱码久久久久久中文字幕 | 亚洲综合精品香蕉久久网| 国产成人亚洲综合一区| 亚洲AV日韩精品一区二区三区| 丝袜捆绑调教视频免费区| 亚洲天堂电影在线观看| 亚洲国产成人VA在线观看| 亚洲视频免费播放| AV激情亚洲男人的天堂国语| 亚洲av综合av一区| 暖暖免费高清日本中文| 99re热精品视频国产免费| 亚洲aⅴ无码专区在线观看| 亚洲人成无码网WWW| av无码国产在线看免费网站| yy一级毛片免费视频| 亚洲精品tv久久久久久久久| 亚洲天堂免费在线| 国产一级片免费看| 看免费毛片天天看| 国产亚洲综合成人91精品| 成人免费无码精品国产电影| 久久精品国产大片免费观看| 免费一级特黄特色大片| 亚洲五月丁香综合视频| 国产成人A人亚洲精品无码| 蜜桃AV无码免费看永久| 成年网在线观看免费观看网址| 久久精品亚洲AV久久久无码| 日韩亚洲人成在线综合日本 | 亚洲精品91在线| 精品亚洲成α人无码成α在线观看 | 香蕉大伊亚洲人在线观看| 亚洲国产精品嫩草影院在线观看 | eeuss草民免费| 亚洲自偷自偷在线成人网站传媒| 亚洲av色福利天堂| 18禁无遮挡无码网站免费| 免费一级不卡毛片|