快速排序

1. 先找一個(gè)基準(zhǔn)數(shù)base,通常選擇最左邊(\color{red}{nums[left]})或者最右邊(\color{red}{nums[right]}
2. 找到這個(gè)基準(zhǔn)數(shù)在數(shù)組中的位置(從小到大排序)

a. 兩個(gè)flag拟糕,一個(gè)從最左端開始(flag_low = left),一個(gè)從最右端開始(flag_high = right)七咧,一個(gè)向右和措,一個(gè)向左钉嘹,直到兩個(gè)flag相遇
b. 如果nums[low] <= base 剂娄,則代表nums[low]的位置合理--> low++蠢涝,繼續(xù)向右尋找;
c. 如果nums[high] >= base,則代表nums[high]的位置合理--> high--,繼續(xù)向左尋找;
\color{red}{注意}如果基準(zhǔn)數(shù)是nums[left], 則從high-- 開始趾牧,如果基準(zhǔn)數(shù)是nums[right],則從left++開始
d. 當(dāng)兩個(gè)flag都到達(dá)不符合的位置儿咱,則交換low high指向的值
e. 當(dāng)兩個(gè)flag相遇時(shí),就到了基準(zhǔn)數(shù)應(yīng)該在的位置场晶,nums[flag_high] = base;

3. 調(diào)用遞歸混埠,分別對(duì)基準(zhǔn)數(shù)左邊[ left, flag-1 ]和基準(zhǔn)數(shù)右邊[ flag+1, right ]的數(shù)組進(jìn)行排序

以數(shù)組最左邊為基準(zhǔn)數(shù):nums[left]

 void quickSort (int left, int right, vector<int>& nums) {
     if (left >= right)  return;
     // find base num
     int base = nums[left];
     // two flags. flag_low & flag_high
     int flag_low = left;
     int flag_high = right;
     while (flag_low < flag_high) {
         while (nums[flag_high] >= base && flag_low < flag_high) {
             flag_high--;
         }
         while (nums[flag_low] <= base && flag_low < flag_high) {
             flag_low++;
         }
         if (flag_low < flag_high) {
             int tmp = nums[flag_low];
             nums[flag_low] =  nums[flag_high];
             nums[flag_high] = tmp;
        }
     }
     nums[left] = nums[flag_low];
     int flag = flag_high;
     nums[flag] = base;  //flag_high = flag_low;

     //遞歸
     quickSort(left, flag-1, nums);
     quickSort(flag+1, right, nums);
}

以數(shù)組最右邊為基準(zhǔn)數(shù):nums[right]

 void quickSort (int left, int right, vector<int>& nums) {
     if (left >= right)  return;
     // find base num
     int base = nums[right];
     // two flags. flag_low & flag_high
     int flag_low = left;
     int flag_high = right;
     while (flag_low < flag_high) {
         while (nums[flag_low] <= base && flag_low < flag_high) {
             flag_low++;
         }
         while (nums[flag_high] >= base && flag_low < flag_high) {
             flag_high--;
         }
         if (flag_low < flag_high) {
             int tmp = nums[flag_low];
             nums[flag_low] =  nums[flag_high];
             nums[flag_high] = tmp;
        }
     }
     int flag = flag_high;
     nums[right] = nums[flag];
     nums[flag] = base;  //flag_high = flag_low;

     //遞歸
     quickSort(left, flag-1, nums);
     quickSort(flag+1, right, nums);
}

以左邊為基準(zhǔn),返回從大到小排序結(jié)果

void quickSort (int left, int right, vector<int>& nums) {
     if (left >= right)  return;
     // find base num
     int base = nums[left];
     // two flags. flag_low & flag_high
     int flag_low = left;
     int flag_high = right;
     while (flag_low < flag_high) {
         while (nums[flag_high] <= base && flag_low < flag_high) {
             flag_high--;
         }
         while (nums[flag_low] >= base && flag_low < flag_high) {
             flag_low++;
         }
         if (flag_low < flag_high) {
             int tmp = nums[flag_low];
             nums[flag_low] =  nums[flag_high];
             nums[flag_high] = tmp;
        }
     }
     int flag = flag_high;
     nums[left] = nums[flag];
     nums[flag] = base;  //flag_high = flag_low;

     //遞歸
     quickSort(left, flag-1, nums);
     quickSort(flag+1, right, nums);
}

  1. 排序算法是穩(wěn)定的嗎诗轻?
    不穩(wěn)定
    排序算法的穩(wěn)定性是說钳宪,如果在數(shù)組中,存在a[i] = a[j]扳炬,那在排序的過程中吏颖,如果a[i]和a[j]的前后順序不會(huì)發(fā)生改變,則代表它是穩(wěn)定的恨樟;如果順序會(huì)發(fā)生改變半醉,則不穩(wěn)定。
  2. 排序算法的時(shí)間復(fù)雜度
    最壞:O(N^2)劝术,平均復(fù)雜度是O(N*log(N))
    完成一次遍歷的復(fù)雜度是N缩多,需要遍歷的次數(shù)呆奕,最多是N,最少是log(N)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末衬吆,一起剝皮案震驚了整個(gè)濱河市梁钾,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌逊抡,老刑警劉巖姆泻,帶你破解...
    沈念sama閱讀 211,123評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異冒嫡,居然都是意外死亡麦射,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,031評(píng)論 2 384
  • 文/潘曉璐 我一進(jìn)店門灯谣,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人蛔琅,你說我怎么就攤上這事胎许。” “怎么了罗售?”我有些...
    開封第一講書人閱讀 156,723評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵辜窑,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我寨躁,道長(zhǎng)穆碎,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,357評(píng)論 1 283
  • 正文 為了忘掉前任职恳,我火速辦了婚禮所禀,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘放钦。我一直安慰自己色徘,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,412評(píng)論 5 384
  • 文/花漫 我一把揭開白布操禀。 她就那樣靜靜地躺著褂策,像睡著了一般。 火紅的嫁衣襯著肌膚如雪颓屑。 梳的紋絲不亂的頭發(fā)上斤寂,一...
    開封第一講書人閱讀 49,760評(píng)論 1 289
  • 那天,我揣著相機(jī)與錄音揪惦,去河邊找鬼遍搞。 笑死,一個(gè)胖子當(dāng)著我的面吹牛器腋,可吹牛的內(nèi)容都是我干的尾抑。 我是一名探鬼主播歇父,決...
    沈念sama閱讀 38,904評(píng)論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼再愈!你這毒婦竟也來了榜苫?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,672評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤翎冲,失蹤者是張志新(化名)和其女友劉穎垂睬,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體抗悍,經(jīng)...
    沈念sama閱讀 44,118評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡驹饺,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,456評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了缴渊。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片赏壹。...
    茶點(diǎn)故事閱讀 38,599評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖衔沼,靈堂內(nèi)的尸體忽然破棺而出蝌借,到底是詐尸還是另有隱情,我是刑警寧澤指蚁,帶...
    沈念sama閱讀 34,264評(píng)論 4 328
  • 正文 年R本政府宣布菩佑,位于F島的核電站,受9級(jí)特大地震影響凝化,放射性物質(zhì)發(fā)生泄漏稍坯。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,857評(píng)論 3 312
  • 文/蒙蒙 一搓劫、第九天 我趴在偏房一處隱蔽的房頂上張望瞧哟。 院中可真熱鬧,春花似錦枪向、人聲如沸绢涡。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,731評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽雄可。三九已至,卻和暖如春缠犀,著一層夾襖步出監(jiān)牢的瞬間数苫,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,956評(píng)論 1 264
  • 我被黑心中介騙來泰國打工辨液, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留虐急,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,286評(píng)論 2 360
  • 正文 我出身青樓滔迈,卻偏偏與公主長(zhǎng)得像止吁,于是被迫代替她去往敵國和親被辑。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,465評(píng)論 2 348