C#排序算法之快速排序

快速排序.gif
  1. 快速排序星压,也叫分治法杭煎,是9種經(jīng)典排序方法中效率最高的咐汞。

  2. 原理:以升序?yàn)槔?/strong>,每輪比較之后瓣颅,保證基準(zhǔn)值左邊的數(shù)比它小,右邊的數(shù)比它大譬正。

  3. 思路:使用分治法(Divide and conquer)策略來把一個(gè)序列(list)分成兩個(gè)子序列(sub-list)宫补。
    (3.1)從數(shù)列中挑出一個(gè)元素,稱為"基準(zhǔn)"(pivot)曾我。
    (3.2)重新排列數(shù)列粉怕,所有元素比基準(zhǔn)值小的擺放在基準(zhǔn)左邊,所有元素比基準(zhǔn)值大的擺放在基準(zhǔn)右邊抒巢。
    ......
    (3.3)遞歸地(recursive)把小于基準(zhǔn)值元素的子數(shù)列和大于基準(zhǔn)值元素的子數(shù)列再次進(jìn)行排序贫贝。
    4.舉例:
    (1)要排序的數(shù)組是:[15, 22, 35, 9, 16, 33, 15, 23, 68, 1, 33, 25, 14]。

        //相對來說蛉谜,快速排序數(shù)值越大速度越快 稚晚。  快速排序是所有排序里面最快的
    class Program
    {
     static void Main(string[] args)
     {
         int[] arr = { 15, 22, 35, 9, 16, 33, 15, 23, 68, 1, 33, 25, 14 }; //待排序數(shù)組
         //控制臺(tái)遍歷輸出
         Console.WriteLine("排序前的數(shù)列:");
         foreach (int item in arr)
             Console.Write(item + " ");
    
    
         QuickSort(arr, 0, arr.Length - 1);  //調(diào)用快速排序函數(shù)。傳值(要排序數(shù)組型诚,基準(zhǔn)值位置蜈彼,數(shù)組長度)
    
         //控制臺(tái)遍歷輸出
         Console.WriteLine();
         Console.WriteLine("排序后的數(shù)列:");
         foreach (int item in arr)
             Console.Write(item+" ");
    
         Console.ReadLine();
     }
    
     private static void QuickSort(int[] arr, int begin, int end)
     {
         if (begin >= end) return;   //兩個(gè)指針重合就返回,結(jié)束調(diào)用
         int pivotIndex = QuickSort_Once(arr, begin, end);  //會(huì)得到一個(gè)基準(zhǔn)值下標(biāo)
    
         QuickSort(arr, begin, pivotIndex - 1);  //對基準(zhǔn)的左端進(jìn)行排序  遞歸
         QuickSort(arr, pivotIndex + 1, end);   //對基準(zhǔn)的右端進(jìn)行排序  遞歸
     }
    
     private static int QuickSort_Once(int[] arr, int begin, int end)
     {
         int pivot = arr[begin];   //將首元素作為基準(zhǔn)
         int i = begin;
         int j = end;
         while (i < j)
         {
             while (arr[j] >= pivot && i < j)  //從右到左俺驶,尋找第一個(gè)小于基準(zhǔn)pivot的元素
             {
                 j--; //指針向前移
             }
             arr[i] = arr[j];  //執(zhí)行到此幸逆,j已指向從右端起第一個(gè)小于基準(zhǔn)pivot的元素,執(zhí)行替換
    
             
             while (arr[i] <= pivot && i < j) //從左到右暮现,尋找首個(gè)大于基準(zhǔn)pivot的元素
             {
                 i++; //指針向后移
             }
             arr[j] = arr[i];  //執(zhí)行到此,i已指向從左端起首個(gè)大于基準(zhǔn)pivot的元素还绘,執(zhí)行替換
         }
    
         //退出while循環(huán),執(zhí)行至此,必定是 i= j的情況(最后兩個(gè)指針會(huì)碰頭)
         //i(或j)所指向的既是基準(zhǔn)位置栖袋,定位該趟的基準(zhǔn)并將該基準(zhǔn)位置返回
         arr[i] = pivot;
         return i;
     }
    

    }
    5.輸出結(jié)果

    排序前的數(shù)列:
    15 22 35 9 16 33 15 23 68 1 33 25 14
    排序后的數(shù)列:
    1 9 14 15 15 16 22 23 25 33 33 35 68
    
  • 快速排序的時(shí)間主要耗費(fèi)在劃分操作上拍顷,對長度為k的區(qū)間進(jìn)行劃分,共需k-1次關(guān)鍵字的比較塘幅;
  • 最壞情況是每次劃分選取的基準(zhǔn)都是當(dāng)前無序區(qū)中關(guān)鍵字最小(或最大)的記錄昔案,劃分的結(jié)果是基準(zhǔn)左邊的子區(qū)間為空(或右邊的子區(qū)間為空),而劃分所得的另一個(gè)非空的子區(qū)間中記錄數(shù)目电媳,僅僅比劃分前的無序區(qū)中記錄個(gè)數(shù)減少一個(gè)踏揣。時(shí)間復(fù)雜度為O(n*n);
  • 在最好情況下匾乓,每次劃分所取的基準(zhǔn)都是當(dāng)前無序區(qū)的"中值"記錄捞稿,劃分的結(jié)果是基準(zhǔn)的左、右兩個(gè)無序子區(qū)間的長度大致相等∮榫郑總的關(guān)鍵字比較次數(shù):O(nlogn)彰亥;
  • 盡管快速排序的最壞時(shí)間為O(n*n),但就平均性能而言衰齐,它是基于關(guān)鍵字比較的內(nèi)部排序算法中速度最快者任斋,快速排序亦因此而得名。它的平均時(shí)間復(fù)雜度為O(nlogn)耻涛。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末仁卷,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子犬第,更是在濱河造成了極大的恐慌锦积,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,888評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件歉嗓,死亡現(xiàn)場離奇詭異丰介,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)鉴分,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,677評論 3 399
  • 文/潘曉璐 我一進(jìn)店門哮幢,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人志珍,你說我怎么就攤上這事橙垢。” “怎么了伦糯?”我有些...
    開封第一講書人閱讀 168,386評論 0 360
  • 文/不壞的土叔 我叫張陵柜某,是天一觀的道長。 經(jīng)常有香客問我敛纲,道長喂击,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,726評論 1 297
  • 正文 為了忘掉前任淤翔,我火速辦了婚禮翰绊,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘旁壮。我一直安慰自己监嗜,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,729評論 6 397
  • 文/花漫 我一把揭開白布抡谐。 她就那樣靜靜地躺著裁奇,像睡著了一般。 火紅的嫁衣襯著肌膚如雪童叠。 梳的紋絲不亂的頭發(fā)上框喳,一...
    開封第一講書人閱讀 52,337評論 1 310
  • 那天,我揣著相機(jī)與錄音厦坛,去河邊找鬼五垮。 笑死,一個(gè)胖子當(dāng)著我的面吹牛杜秸,可吹牛的內(nèi)容都是我干的放仗。 我是一名探鬼主播,決...
    沈念sama閱讀 40,902評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼撬碟,長吁一口氣:“原來是場噩夢啊……” “哼诞挨!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起呢蛤,我...
    開封第一講書人閱讀 39,807評論 0 276
  • 序言:老撾萬榮一對情侶失蹤惶傻,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后其障,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體银室,經(jīng)...
    沈念sama閱讀 46,349評論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,439評論 3 340
  • 正文 我和宋清朗相戀三年励翼,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了蜈敢。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,567評論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡汽抚,死狀恐怖抓狭,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情造烁,我是刑警寧澤否过,帶...
    沈念sama閱讀 36,242評論 5 350
  • 正文 年R本政府宣布,位于F島的核電站惭蟋,受9級特大地震影響叠纹,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜敞葛,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,933評論 3 334
  • 文/蒙蒙 一誉察、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧惹谐,春花似錦持偏、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,420評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至怎囚,卻和暖如春卿叽,著一層夾襖步出監(jiān)牢的瞬間桥胞,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,531評論 1 272
  • 我被黑心中介騙來泰國打工考婴, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留贩虾,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,995評論 3 377
  • 正文 我出身青樓沥阱,卻偏偏與公主長得像缎罢,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子考杉,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,585評論 2 359

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