算法隨筆:快速排序的思想及實現(xiàn)分析

核心代碼如下:

int partition(int a[],int left,int right){

?????? srand((unsigned)time(NULL));

?????? int p=(round(1.0*rand()/RAND_MAX*(right-left))+left);? ? //選擇軸元素

?????? swap(a[left],a[p]);? ??

?????? int temp=a[left];? ?//將軸元素存放至臨時變量temp

?????? while(left<right){? ? //只要left和right不相遇

????????????? while(left<right && a[right]>temp) right--;? ? //反復左移right

????????????? a[left]=a[right];

????????????? while(left<right && a[left]<=temp) left++;? ? //反復右移left

????????????? a[right]=a[left];

?????? }

?????? a[left]=temp;? //把temp放到left與right相遇的地方

?????? return left;? //返回相遇的下標

}

void quickSort(int a[],int left,int right){

?????? if(left<right){

????????????? int pos=partition(a,left,right);? //將a[left,right]一分為二

????????????? quickSort(a,left,pos-1);? //對左子區(qū)間遞歸進行快速排序

????????????? quickSort(a,pos+1,right);? //對右子區(qū)間遞歸進行快速排序

?????? }

}

?????? 快速排序的核心思想在于每次選擇一個軸绍昂,根據(jù)這個軸進行排序梳虽,比軸小的元素放在軸的左側,比軸大的元素放在軸的右側,當左右指針相遇時為排序邊界力崇,其思想理解起來很容易,在具體實現(xiàn)時有以下需要注意的地方馒胆。

??? (1)隨機數(shù)的生成热康。先用rand()函數(shù)生成一個[0,RAND_MAX]范圍內的隨機數(shù),然后再用這個隨機數(shù)除以RAND_MAX蚕脏,這樣就會得到一個[0,1]范圍內的浮點數(shù)侦副。我們只需要用這個浮點數(shù)乘以(right-left),再加上left即可驼鞭,即(round(1.0*rand()/RAND_MAX*(right-left))+left)秦驯,相當于這個浮點數(shù)就是[left,right]范圍內的比例位置。

??? (2)每次選擇軸時最好是利用隨機數(shù)隨機選擇挣棕,而不是適中使用最左側元素作為軸译隘,這是因為當始終使用最左側元素作為軸時,可能會導致算法的最壞時間復雜度達到O(n^2 )洛心。但采用隨機數(shù)生成軸時算法對于任意輸入數(shù)據(jù)的時間復雜度都能達到o(nlogn)固耘。

??? (3)兩側指針在進行移動時采用分批連續(xù)移動的方法,如上述代碼所示词身。先從右側開始厅目,判斷當前元素是否大于軸元素,若大于則持續(xù)左移法严,直至遇到第一個小于等于軸元素的數(shù)损敷,然后將該元素與左側指針所指的數(shù)進行交換;然后從左側開始看深啤,判斷當前元素是否小于等于軸元素拗馒,若小于等于則持續(xù)右移,直至遇到第一個大于軸元素的數(shù)溯街,然后將該元素與右側指針所指的數(shù)交換诱桂;再從右邊看….直至左右指針重合為止。

??? (4)具體排序的時候就直接遞歸調用呈昔,不斷地選擇軸元素挥等、分塊,最后達到有序的狀態(tài)堤尾。

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末触菜,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子哀峻,更是在濱河造成了極大的恐慌涡相,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,084評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件剩蟀,死亡現(xiàn)場離奇詭異催蝗,居然都是意外死亡,警方通過查閱死者的電腦和手機育特,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,623評論 3 392
  • 文/潘曉璐 我一進店門丙号,熙熙樓的掌柜王于貴愁眉苦臉地迎上來先朦,“玉大人,你說我怎么就攤上這事犬缨≡海” “怎么了?”我有些...
    開封第一講書人閱讀 163,450評論 0 353
  • 文/不壞的土叔 我叫張陵怀薛,是天一觀的道長刺彩。 經(jīng)常有香客問我,道長枝恋,這世上最難降的妖魔是什么创倔? 我笑而不...
    開封第一講書人閱讀 58,322評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮焚碌,結果婚禮上畦攘,老公的妹妹穿的比我還像新娘。我一直安慰自己十电,他們只是感情好知押,可當我...
    茶點故事閱讀 67,370評論 6 390
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著鹃骂,像睡著了一般台盯。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上偎漫,一...
    開封第一講書人閱讀 51,274評論 1 300
  • 那天爷恳,我揣著相機與錄音有缆,去河邊找鬼象踊。 笑死,一個胖子當著我的面吹牛棚壁,可吹牛的內容都是我干的杯矩。 我是一名探鬼主播,決...
    沈念sama閱讀 40,126評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼袖外,長吁一口氣:“原來是場噩夢啊……” “哼史隆!你這毒婦竟也來了?” 一聲冷哼從身側響起曼验,我...
    開封第一講書人閱讀 38,980評論 0 275
  • 序言:老撾萬榮一對情侶失蹤泌射,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后鬓照,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體熔酷,經(jīng)...
    沈念sama閱讀 45,414評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,599評論 3 334
  • 正文 我和宋清朗相戀三年豺裆,在試婚紗的時候發(fā)現(xiàn)自己被綠了拒秘。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,773評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖躺酒,靈堂內的尸體忽然破棺而出押蚤,到底是詐尸還是另有隱情,我是刑警寧澤羹应,帶...
    沈念sama閱讀 35,470評論 5 344
  • 正文 年R本政府宣布揽碘,位于F島的核電站,受9級特大地震影響量愧,放射性物質發(fā)生泄漏钾菊。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,080評論 3 327
  • 文/蒙蒙 一偎肃、第九天 我趴在偏房一處隱蔽的房頂上張望煞烫。 院中可真熱鬧,春花似錦累颂、人聲如沸滞详。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,713評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽料饥。三九已至,卻和暖如春朱监,著一層夾襖步出監(jiān)牢的瞬間岸啡,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,852評論 1 269
  • 我被黑心中介騙來泰國打工赫编, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留巡蘸,地道東北人。 一個月前我還...
    沈念sama閱讀 47,865評論 2 370
  • 正文 我出身青樓擂送,卻偏偏與公主長得像悦荒,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子嘹吨,可洞房花燭夜當晚...
    茶點故事閱讀 44,689評論 2 354

推薦閱讀更多精彩內容

  • 7種常用的排序算法總結 2016.04.30PoetryAlgorithm 排序算法:一種能將一串數(shù)據(jù)依照特定的排...
    raining_804f閱讀 790評論 0 0
  • 最常見的七大排序算法搬味,整理了下,包括時間復雜度和空間復雜度都做一個詳細的解說蟀拷,希望對需要的人能有所幫助碰纬。 /** ...
    PapiAP閱讀 351評論 0 2
  • 1、 奶奶今早死了问芬,也許是昨天悦析,我不清楚。 我在外地愈诚,趕早班火車她按,到家時已經(jīng)晚了——只見到煉化后的骨灰牛隅,放在木盒或...
    小李是只鬼閱讀 450評論 0 1
  • 今天隨著各快遞公司緊張有序地分揀,運送酌泰。包裹已經(jīng)陸續(xù)送達到買家手里媒佣。湘水明珠是珠暉區(qū)包裹最多的小區(qū),小區(qū)門口...
    紫月蘅兒閱讀 403評論 1 2
  • 有人說也糊,樣貌其實不重要,心靈美才是最重要的羡宙;可也有人說狸剃,現(xiàn)在的人都是看外貌的,美貌就是一個人的名片狗热!你覺得呢...
    浮酒若夢閱讀 601評論 0 0