看圖說話排序算法之快速排序

????本文著重介紹快速排序算法(quick sort),快速排序和冒泡排序一樣是交換排序的一種怜俐,快速排序算法可以看成是對冒泡排序算法的改進算法,其平均時間復(fù)雜度在nlog(n),基本上是已知的排序算法中速度最快的一種邓尤。
????冒泡排序的核心思想是通過一次冒泡交換將最大的元素置換到末尾拍鲤,通過N-1次這樣的冒泡交換贴谎,完成對待排序數(shù)組的排序。
????快速排序的核心思想是通過一個partition(分割)操作季稳,將數(shù)組的某一個元素放置到正確的排序位置擅这,接著遞歸對該元素的左側(cè)和右側(cè)分別進行partition操作,直到所有的元素都放到正確的位置景鼠,這樣排序就結(jié)束了仲翎。
????下面通過一個圖例的方式來介紹對待排序數(shù)組的一次partition操作。假設(shè)待排序數(shù)組int []A = new int[]{5,1,4,7,9,3,2,5}莲蜘。

一丶快速排序原理
  1. 隨便選取一個元素(后文簡稱特定元素)谭确,這里選取第一個元素5,目的是將元素5放置到正確的排序位置票渠,讓元素5左側(cè)的元素都小于或等于5逐哈,右側(cè)的元素都大于5。

  2. 在partition操作中问顷,維護三個重要成員昂秃,left指針指向區(qū)間的第一個元素,right指針指向區(qū)間的最后一個元素杜窄,以及對選中元素額備份肠骆。


    image
  3. 移動right指針,right=right-1塞耕,一直到A[right]<=5,停止移動移動left指針蚀腿,left = left+1,一直到A[left]>5停止移動扫外。


    image
  4. left指針移動和right指針移動結(jié)束后莉钙,交換left指針和right指針指向的內(nèi)容。


    image
  5. 繼續(xù)重復(fù)步驟2筛谚,3磁玉,4


    image

    image
  6. 繼續(xù)重復(fù)步驟2,3驾讲,4發(fā)現(xiàn)left=right,兩個指針相遇了蚊伞,那么結(jié)束本次partition操作,讓 left和right共同指向的元素去覆蓋選中的元素5吮铭。


    image

    image
  7. 將備份的元素5覆蓋left和right共同指向的元素时迫。


    image
  8. 執(zhí)行完步驟7之后,一次的partion操作就結(jié)束了谓晌,將數(shù)組分割成的兩個部分掠拳,在指定元素5的左側(cè),所有的元素都小于或等于5扎谎,在指定元素的右側(cè)所有的元素都大于5碳想。對左側(cè)的數(shù)組{3烧董,1,4胧奔,5逊移,2}和右側(cè)數(shù)組{9,7}遞歸partition操作龙填。遞歸執(zhí)行partition函數(shù)后胳泉,快速排序就完成了,數(shù)組也由無序變?yōu)榱擞行虻臓顟B(tài)了岩遗。

二丶快速排序的細節(jié)分析

(1)在一次partition操作中扇商,對特定元素的指定一般都取待排序區(qū)間中的第一個元素。
(2)left指針和right指針的移動順序是存在區(qū)別的宿礁,必須先移動right指針案铺,后移動left指針。試想當(dāng)left和right指針相遇的時候梆靖,若先移動right指針控汉,可以保證最后left和right指向的元素是嚴格小于或等于被指定元素的。這樣在執(zhí)行步驟7和步驟8之后返吻,可以完全的保證被指定元素放置在合適的位置——左側(cè)的所有元素小于自身姑子,右側(cè)的所有元素大于自身。
(3)快速排序的每一次partition操作测僵,必須輸入兩個參數(shù)——start和end街佑。start代表待排序區(qū)間的開始位置,end代表待排序區(qū)間的結(jié)束位置捍靠。
(4)每一次partition操作沐旨,必須返回特定元素分割后的位置,用作下一次partition操作的依據(jù)剂公。
(5)每次partition操作希俩,如果start>end.則不執(zhí)行partition流程吊宋。

三丶java代碼實現(xiàn)
 public static void quickSort(int [] num,intstart,int end){
      if(start>end)
        return ;
      int mid = partition(num,start,end);
     
      quickSort(num,start,mid-1);
 
      quickSort(num,mid+1,end);
   }
   public static int  partition(int[] num,int start,int end){
      int copy = num[start];
      int left = start;
      int right = end;
      while(left<right){
        while(left<right&&num[right]>copy){
           right = right -1;
        }
        while(left<right&&num[left]<=copy){
           left++;
        }
        int temp = num[left];
        num[left] = num[right];
        num[right] =temp;
      }
      num[start] = num[left];
      num[left] = copy;
     
      return left;
   } 

Referecne:
[1] 數(shù)據(jù)結(jié)構(gòu)與算法 java語言描述版
[2] 原文博客鏈接

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末纲辽,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子璃搜,更是在濱河造成了極大的恐慌拖吼,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,755評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件这吻,死亡現(xiàn)場離奇詭異吊档,居然都是意外死亡,警方通過查閱死者的電腦和手機唾糯,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評論 3 395
  • 文/潘曉璐 我一進店門怠硼,熙熙樓的掌柜王于貴愁眉苦臉地迎上來鬼贱,“玉大人,你說我怎么就攤上這事香璃≌饽眩” “怎么了?”我有些...
    開封第一講書人閱讀 165,138評論 0 355
  • 文/不壞的土叔 我叫張陵葡秒,是天一觀的道長姻乓。 經(jīng)常有香客問我,道長眯牧,這世上最難降的妖魔是什么蹋岩? 我笑而不...
    開封第一講書人閱讀 58,791評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮学少,結(jié)果婚禮上剪个,老公的妹妹穿的比我還像新娘。我一直安慰自己版确,他們只是感情好禁偎,可當(dāng)我...
    茶點故事閱讀 67,794評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著阀坏,像睡著了一般如暖。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上忌堂,一...
    開封第一講書人閱讀 51,631評論 1 305
  • 那天盒至,我揣著相機與錄音,去河邊找鬼士修。 笑死枷遂,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的棋嘲。 我是一名探鬼主播酒唉,決...
    沈念sama閱讀 40,362評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼沸移!你這毒婦竟也來了痪伦?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,264評論 0 276
  • 序言:老撾萬榮一對情侶失蹤雹锣,失蹤者是張志新(化名)和其女友劉穎网沾,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體蕊爵,經(jīng)...
    沈念sama閱讀 45,724評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡辉哥,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片醋旦。...
    茶點故事閱讀 40,040評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡恒水,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出饲齐,到底是詐尸還是另有隱情寇窑,我是刑警寧澤,帶...
    沈念sama閱讀 35,742評論 5 346
  • 正文 年R本政府宣布箩张,位于F島的核電站甩骏,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏先慷。R本人自食惡果不足惜饮笛,卻給世界環(huán)境...
    茶點故事閱讀 41,364評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望论熙。 院中可真熱鬧福青,春花似錦、人聲如沸脓诡。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,944評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽祝谚。三九已至宪迟,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間交惯,已是汗流浹背次泽。 一陣腳步聲響...
    開封第一講書人閱讀 33,060評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留席爽,地道東北人意荤。 一個月前我還...
    沈念sama閱讀 48,247評論 3 371
  • 正文 我出身青樓,卻偏偏與公主長得像只锻,于是被迫代替她去往敵國和親玖像。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,979評論 2 355

推薦閱讀更多精彩內(nèi)容