算法學習:快速排序

  • 背景介紹
    又稱劃分交換排序(partition-exchange sort),一種排序算法,最早由東尼·霍爾提出。在平均狀況下,排序n個項目要Ο(n log n)次比較。在最壞狀況下則需要Ο(n2)次比較,但這種狀況并不常見。事實上,快速排序通常明顯比其他Ο(n log n)算法更快,因為它的內(nèi)部循環(huán)(inner loop)可以在大部分的架構上很有效率地被實現(xiàn)出來 ----- 來自 wikipedia

  • 算法規(guī)則
    本質(zhì)來說,快速排序的過程就是不斷地將無序元素集遞歸分割,一直到所有的分區(qū)只包含一個元素為止。
    由于快速排序是一種分治算法,我們可以用分治思想將快排分為三個步驟:
    1.分:設定一個分割值,并根據(jù)它將數(shù)據(jù)分為兩部分
    2.治:分別在兩部分用遞歸的方式,繼續(xù)使用快速排序法
    3.合:對分割的部分排序直到完成

  • 代碼實現(xiàn)(Java版本)

        public int dividerAndChange(int[] args, int start, int end) 
        {   
            //標準值
            int pivot = args[start];
            while (start < end) {
                // 從右向左尋找,一直找到比參照值還小的數(shù)值,進行替換
                // 這里要注意,循環(huán)條件必須是 當后面的數(shù) 小于 參照值的時候
                // 我們才跳出這一層循環(huán)
                while (start < end && args[end] >= pivot)
                    end--;
    
                if (start < end) {
                    swap(args, start, end);
                    start++;
                }
    
                // 從左向右尋找,一直找到比參照值還大的數(shù)組,進行替換
                while (start < end && args[start] < pivot)
                    start++;
    
                if (start < end) {
                    swap(args, end, start);
                    end--;
                }
            }
    
            args[start] = pivot;
            return start;
        }

        public void quickSort(int[] args, int start, int end) 
        {
            //當分治的元素大于1個的時候,才有意義
            if ( end - start > 1) {
                int mid = 0;
                mid = dividerAndChange(args, start, end);
                // 對左部分排序
                sort(args, start, mid);
                // 對右部分排序
                sort(args, mid + 1, end);
            }
        }

        private void swap(int[] args, int fromIndex, int toIndex) 
        {
            args[fromIndex] = args[toIndex];
        }
最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

  • 背景 一年多以前我在知乎上答了有關LeetCode的問題, 分享了一些自己做題目的經(jīng)驗。 張土汪:刷leetcod...
    土汪閱讀 12,928評論 0 33
  • 前言 提前說明一下吧。這篇文章只是記錄自己學習《算法》——快速排序的過程,只會記錄自己對算法實現(xiàn)過程的基本理解并不...
    惡趣男閱讀 287評論 0 3
  • 假設要排序的數(shù)組是A[0]……A[N-1]。首先任意選取一個數(shù)據(jù)(通常選用數(shù)組的第一個數(shù))作為關鍵數(shù)據(jù),然后將所有...
    vincentgemini閱讀 193評論 0 0
  • 練就 Better Me | 健美樂 今天我將要就三種最常見的訓練目標作為劃分 分別來談一下各自訓練前后的飲食注意...
    健美樂閱讀 775評論 0 2
  • 相思的紅豆你我各藏著一顆如同那往日曾經(jīng)的回憶也是一樣你的一顆在歲月的沙塵里日漸消滅我的一顆在每日的摩挲中憔悴了昔日...
    胡三多閱讀 95評論 0 0

友情鏈接更多精彩內(nèi)容