Java排序之快速排序

前言

快速排序作為排序算法的王者,我們沒有理由不掌握它

引用自大話數(shù)據(jù)結構.png
  • 快速排序的基本思想:
    通過一趟排序將待排序記錄分割成獨立的兩部,其中一部分記錄的關鍵字均比另一部分記錄的關鍵字小,則可分別對這兩部分記錄繼續(xù)進行排序,以達到整個序列有序的目的.

  • 快速排序的快速理解:
    把數(shù)據(jù)分成左右兩部分,左邊的所有數(shù)據(jù)都比右邊數(shù)據(jù)小, 再把左右兩部分的數(shù)據(jù)按同樣的方法排序. 很明顯快速排序是不穩(wěn)定的,排序的結果次序可能不一致.

舉例分析

int s[] = {52,78,12,99,5,18,80,32,66};

快速排序示意圖.png

畫了一張很簡單的圖, 力求簡單.每個格子想象成一個待挖的坑.

第一步: 我們先隨便從數(shù)組中拿一個數(shù)據(jù)作為基準數(shù)p.便于演示,就用s[0] 吧,即p=s[0] . 注意,我們在s[0]處拿了一個數(shù)據(jù),我們就想象從數(shù)組s中挖了一個坑,而且這個坑的位置就是s[0],下面我們來看看如何填坑

第二步:找 s[k] < p :從索引K的結尾處開始向前找. 找比s[0] (即p)小的數(shù).如圖中的綠色箭頭方向,標號①表示綠色查找優(yōu)先紅色查找,很明顯s[7]=32 < s[0]=52 , 此時我們把32挖出來去填s[0]的坑, 讓s[0]=s[7] , 所以此時s[0]為32,就是說我們把第一個坑填了. 但是有一個新坑k[7],此時的數(shù)據(jù)順序:
32,78,12,99,5,18,80,32,66

第三步:找 s[i] > p :從索引 i 的開始處從前向后找.找比s[0] (即p)大的數(shù).如圖中的紅色箭頭方向.我們看到 s[1] = 78 > p=52 .所以我們挖出s[1]的數(shù)據(jù)放到上一步的坑中,就是k[7]了.此時我們的新坑i[1] , 讓 s[7]=s[1],此時的數(shù)據(jù)順序:
32,78,12,99,5,18,80,78,66

我們在第二步中得到了K=7,在第三步中得到了i=1.那么在下一輪的查找中k從6開始,然后i從2開始.這樣重復執(zhí)行第二步然后第三步,直到 i = k . 這樣就完成了左邊的數(shù)據(jù)都是小于右邊的數(shù).之后用同樣的方法從第一步開始分別對左右部分的數(shù)據(jù)進行排序,得到的就是最終的結果

Java代碼示例

原理講完了,我們來擼一下java的實現(xiàn).

public void quickSort(int arr[],int sIndex,int eIndex){
        if (sIndex < eIndex) {
            int p = arr[sIndex] , i = sIndex , k = eIndex;
            while (i < k) {
                while(i < k && arr[k] >= p) // 從右向左找
                    k--;

                if (i < k ) arr[i++] = arr[k];

                while(i < k && arr[i] < p) // 從左向右找
                    i++;

                if (i < k ) arr[k--] = arr[i];
            }
            arr[i] = p;
            quickSort(arr, sIndex, i - 1); // 遞歸
            quickSort(arr, i + 1, eIndex);
        }
}

結束

快速排序還有很多優(yōu)化版本,但是基本思想都是類似的,很大程度上取決P的選擇,比如如果P處于數(shù)列的中間,那么就趨于平衡樹,效率會提高.總的來說,快速排序名副其實,我們應該好好學習它.謝謝大家!

參考文章
白話經(jīng)典算法系列之六 快速排序 快速搞定

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

相關閱讀更多精彩內容

  • 在C語言中,五種基本數(shù)據(jù)類型存儲空間長度的排列順序是: A)char B)char=int<=float C)ch...
    夏天再來閱讀 4,032評論 0 2
  • 計算機二級C語言上機題庫(南開版) 1.m個人的成績存放在score數(shù)組中,請編寫函數(shù)fun,它的功能是:將低于平...
    MrSunbeam閱讀 6,611評論 1 42
  • 1.插入排序—直接插入排序(Straight Insertion Sort) 基本思想: 將一個記錄插入到已排序好...
    依依玖玥閱讀 1,349評論 0 2
  • "use strict";function _classCallCheck(e,t){if(!(e instanc...
    久些閱讀 2,142評論 0 2
  • 188期學員 姓名:孫燕茹 公司:北京旺順閣餐飲管理有限公司 【日精進打卡第5天】 【知~學習】 《六...
    阿茹姐閱讀 356評論 0 1

友情鏈接更多精彩內容