JAVA 實(shí)現(xiàn)快速排序

高效的分治排序

????快速排序是冒泡排序的改進(jìn)版葵硕,是目前已知的最快的排序方法问拘。? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 該排序算法的基本思想是:

1.先從數(shù)列中取出一個(gè)數(shù)作為基準(zhǔn)數(shù)凯沪。

2.分區(qū)過程鸠儿,將比這個(gè)數(shù)大的數(shù)全放到它的右邊献丑,小于或等于它的數(shù)全放到它的左邊涛贯。

3.再對(duì)左右區(qū)間重復(fù)第二步诽嘉,直到各區(qū)間只有一個(gè)數(shù)。

  優(yōu)點(diǎn):極快弟翘,數(shù)據(jù)移動(dòng)少含懊;

? ? ? ? 缺點(diǎn):不穩(wěn)定。

算法實(shí)現(xiàn)

假設(shè)我們現(xiàn)在要對(duì){5,7,2,1,9,10,4,6,3,8}這個(gè)數(shù)組進(jìn)行快速排序衅胀,我們應(yīng)該怎么怎么做呢岔乔?

1.立Flag

? ? Flag就是我們之前提到的基準(zhǔn)數(shù),為了將數(shù)據(jù)分區(qū)滚躯,立Flag是第一步也是最關(guān)鍵的一步雏门。在這里我們將數(shù)組的第一個(gè)數(shù)設(shè)為基準(zhǔn)數(shù)嘿歌。

2.探測(cè)

? ? 對(duì)于{5,7,6,1,9,10,4,2,3,8}這個(gè)數(shù)組,第一次排序我們的Flag是5茁影,我們分別從數(shù)組的左右兩端開始“探測(cè)”宙帝。? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

我們定義i指向數(shù)組的最左端,定義j指向數(shù)組的最右端募闲。首先將j向左移步脓,直到j(luò)指向的數(shù)小于5;再將i向右移浩螺,直到i指向的數(shù)大于5靴患。最終i指向7,j指向3要出。


3.交換

? ? 將3和7交換鸳君,數(shù)組變?yōu)閧5,3,2,1,9,10,4,6,7,8}。第一次交換結(jié)束患蹂。


接下來繼續(xù)探測(cè)或颊、交換,探測(cè)传于、交換......

4.Flag落位

第二次交換結(jié)束后數(shù)組變?yōu)閧5,3,2,1,4,10,9,6,7,8}囱挑。


j指向9的位置,i指向4的位置沼溜,j繼續(xù)向左移動(dòng)平挑,直到i的位置才找到小于5的值。

此時(shí)i=j盛末,我們只需將Flag落在這個(gè)位置:將5和4的值交換。數(shù)組變?yōu)閧4,3,2,1,5,10,9,6,7,8}否淤。


至此悄但,5這個(gè)Flag完成了它的歷史使命,第一輪交換結(jié)束石抡。

數(shù)組被劃分為兩個(gè)區(qū)檐嚣,F(xiàn)lag左邊是小于Flag的{4,3,2,1},F(xiàn)lag右邊是大于Flag的{10,9,6,7,8}啰扛。


5.遞歸

我們?cè)俜謩e對(duì)這兩個(gè)區(qū)進(jìn)行第二輪交換嚎京,交換結(jié)果是{1,3,2,4}和{8,9,6,7,10}

對(duì)于{1,3,2}和{8,9,6,7}重復(fù)進(jìn)行以上操作,直至得到不能拆解的單個(gè)數(shù)字隐解,排序完成鞍帝!

下面用圖展示整個(gè)排序過程:


6.JAVA代碼

public class QuickSort {

? ? public static void quickSort(int[] arr,int low,int high){

? ? ? ? int i,j,temp,t;

? ? ? ? if(low>high){

? ? ? ? ? ? return;????

? ? ? ? }? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? i=low;

? ? ? ? j=high;

? ? ? ? //temp就是基準(zhǔn)位

? ? ? ? temp = arr[low];

? ??????while (i<j){

? ??????//先看右邊,依次往左遞減

? ?????????????????? while (temp<=arr[j]&&i<j){? ?????????

? ????????????? ? ? j--;

? ? ? ? }

? ??????//再看左邊煞茫,依次往右遞增

????????????????????while (temp>=arr[i]&&i<j){

? ? ????????????? ? i++;

? ? ? ? }

????????? ?????? //如果滿足條件則交換

? ? ? ? ? ? ? ? if (i<j){? ? ? ? ? ?????????

? ? ? ????????????? ?t=arr[j];

????????????????????arr[j]=arr[i];

? ????????????? ? ? arr[i]=t;

? ? ? ????????? }

????????}

//最后將基準(zhǔn)為與i和j相等位置的數(shù)字交換

????????arr[low] = arr[i];

? ? ? ? arr[i] = temp;

? ??????//遞歸調(diào)用左半數(shù)組

????????quickSort(arr, low, j-1);? ?

? ?????? //遞歸調(diào)用右半數(shù)組

????????quickSort(arr, j+1, high);

}

public static void main(String[] args){

????????int[] arr = {6,1,2,7,9,11,4,5,10,8};

????????quickSort(arr, 0, arr.length-1);

????????for (int i = 0; i < arr.length; i++) {

????????????????System.out.println(arr[i]);

????????}

????}

}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末帕涌,一起剝皮案震驚了整個(gè)濱河市摄凡,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌蚓曼,老刑警劉巖亲澡,帶你破解...
    沈念sama閱讀 211,884評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異纫版,居然都是意外死亡床绪,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,347評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門其弊,熙熙樓的掌柜王于貴愁眉苦臉地迎上來癞己,“玉大人,你說我怎么就攤上這事瑞凑∧┩海” “怎么了?”我有些...
    開封第一講書人閱讀 157,435評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵籽御,是天一觀的道長(zhǎng)练慕。 經(jīng)常有香客問我,道長(zhǎng)技掏,這世上最難降的妖魔是什么铃将? 我笑而不...
    開封第一講書人閱讀 56,509評(píng)論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮哑梳,結(jié)果婚禮上劲阎,老公的妹妹穿的比我還像新娘。我一直安慰自己鸠真,他們只是感情好悯仙,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,611評(píng)論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著吠卷,像睡著了一般锡垄。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上祭隔,一...
    開封第一講書人閱讀 49,837評(píng)論 1 290
  • 那天货岭,我揣著相機(jī)與錄音,去河邊找鬼疾渴。 笑死千贯,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的搞坝。 我是一名探鬼主播搔谴,決...
    沈念sama閱讀 38,987評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼桩撮!你這毒婦竟也來了己沛?” 一聲冷哼從身側(cè)響起慌核,我...
    開封第一講書人閱讀 37,730評(píng)論 0 267
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎申尼,沒想到半個(gè)月后垮卓,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,194評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡师幕,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,525評(píng)論 2 327
  • 正文 我和宋清朗相戀三年粟按,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片霹粥。...
    茶點(diǎn)故事閱讀 38,664評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡灭将,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出后控,到底是詐尸還是另有隱情庙曙,我是刑警寧澤,帶...
    沈念sama閱讀 34,334評(píng)論 4 330
  • 正文 年R本政府宣布浩淘,位于F島的核電站捌朴,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏张抄。R本人自食惡果不足惜砂蔽,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,944評(píng)論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望署惯。 院中可真熱鬧左驾,春花似錦、人聲如沸极谊。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,764評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)轻猖。三九已至帆吻,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間蜕依,已是汗流浹背桅锄。 一陣腳步聲響...
    開封第一講書人閱讀 31,997評(píng)論 1 266
  • 我被黑心中介騙來泰國(guó)打工琉雳, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留样眠,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,389評(píng)論 2 360
  • 正文 我出身青樓翠肘,卻偏偏與公主長(zhǎng)得像檐束,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子束倍,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,554評(píng)論 2 349

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

  • 最常見的七大排序算法被丧,整理了下盟戏,包括時(shí)間復(fù)雜度和空間復(fù)雜度都做一個(gè)詳細(xì)的解說,希望對(duì)需要的人能有所幫助甥桂。 /** ...
    PapiAP閱讀 348評(píng)論 0 2
  • 7種常用的排序算法總結(jié) 2016.04.30PoetryAlgorithm 排序算法:一種能將一串?dāng)?shù)據(jù)依照特定的排...
    raining_804f閱讀 785評(píng)論 0 0
  • 寫作是一個(gè)具有系統(tǒng)性的技能柿究,是由寫作方法和基本規(guī)律構(gòu)成的。學(xué)習(xí)寫作黄选,可以全方位提高自己的能力蝇摸。 注意:寫作不是一件...
    小原ing閱讀 227評(píng)論 2 2
  • 又一次來到這里。 沿著長(zhǎng)長(zhǎng)的小青磚鋪就的小巷办陷,一直往前貌夕,一座雕花樓左拐,穿過一個(gè)深深的庭院 民镜,抬頭啡专,殘?jiān)珨啾陂g依然...
    春羽之閱讀 274評(píng)論 0 2
  • 人世的風(fēng)沙雕塑我的模樣 四面八方的繩索把我捆綁 世界是一個(gè)大大的囚房 仿佛,沒有人可以逃過命運(yùn)的流放 沒有人可以躲...
    心海安瀾閱讀 291評(píng)論 4 8