快速排序

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

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

代碼實現(Java版本)

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

                if (start < end) {
                    swap(args, start, end);
                    start++;
                }

                // 從左向右尋找,一直找到比參照值還大的數組,進行替換
                while (start < end && args[start] < pivot)
                    start++;

                if (start < end) {
                    swap(args, end, start);
                    end--;
                }
            }

            args[start] = pivot;
            return start;
        }

        public void sort(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];
        }
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容