<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 哥哥
    誤人子弟啊!  回復  更多評論
      

    主站蜘蛛池模板: 国产精品免费看香蕉| 最近的中文字幕大全免费8| 久久天天躁狠狠躁夜夜免费观看| 国产亚洲人成网站观看| 久久国产乱子伦精品免费午夜 | 久久久久久久亚洲精品| 久久人午夜亚洲精品无码区 | 国产成人免费高清激情明星| 亚洲高清视频在线观看| 少妇人妻偷人精品免费视频| 亚洲美女免费视频| 91免费国产在线观看| 亚洲真人无码永久在线观看| 国产黄色片在线免费观看| 福利片免费一区二区三区| 亚洲精品视频免费| 永久免费不卡在线观看黄网站 | 中文字幕亚洲男人的天堂网络 | 亚洲国产中文字幕在线观看| 一级毛片在播放免费| 亚洲va无码va在线va天堂| 91福利免费视频| 亚洲精品国产日韩| 国产免费黄色大片| 黄床大片免费30分钟国产精品| 亚洲AV永久青草无码精品| 91人成网站色www免费下载| 国产亚洲精品bv在线观看| 亚洲av无码国产精品色在线看不卡| 国产一二三四区乱码免费| 亚洲一本综合久久| 成人奭片免费观看| 国产免费高清69式视频在线观看| 亚洲国产精品第一区二区 | 亚洲伊人成无码综合网| 国产精品免费观看调教网| 亚洲AV无码乱码在线观看代蜜桃 | 国产成A人亚洲精V品无码| 毛片a级三毛片免费播放| 一级毛片在线免费视频| 亚洲同性男gay网站在线观看|