排序算法

快速排序:顧名思義就是快貌夕,c語言底層實現(xiàn)的排序算法主要就是用的快速排序律歼。
快速排序,最好時間復(fù)雜度是nlogn,最壞是n^2,一般時間復(fù)雜度是nlogn啡专。

    func quickSort(_ array: inout Array<Int>, _ left: Int, _ right: Int) -> Void{
        if left < right {
            let point = partition(&array, left, right)
            quickSort(&array, left, point - 1)
            quickSort(&array , point + 1, right)
        }
    }
 
    func partition(_ array: inout Array<Int>, _ left: Int, _ right: Int) -> Int {
        let pivot = array[right] // 選最后一個數(shù)作為基準(zhǔn)值
        var i = left // 暫時初始化想選的中間值為最左值险毁,動態(tài)改變更適合的中間值位置
        for j in left ..< right { // 從最左邊遍歷數(shù)組,除了最后一個已經(jīng)挑出來的數(shù)
            if array[j] < pivot {// 把遍歷得到的數(shù)和最后一個數(shù)進行比較,如果它比最后數(shù)小畔况,則說明需要它和暫時選擇的中間值進行交換离唐,
                array.swapAt(j, i)
                i += 1// 這里加1,是需要理解i值的作用问窃,它是暫時的中間值下標(biāo),也就是說它應(yīng)該起到分割數(shù)據(jù)的作用完沪,左邊的數(shù)都是小于基準(zhǔn)值的域庇,右邊是待比較的數(shù)據(jù),通過上面一步的交換后覆积,說明舊的i下標(biāo)現(xiàn)在存儲的值是小于基準(zhǔn)值的听皿,如果不加1,那就起不到分割數(shù)據(jù)的作用宽档,所以加1后尉姨,相對于新i下標(biāo),左邊的數(shù)又是小于基準(zhǔn)值的吗冤。
            }
        }
        array.swapAt(right, i)
        return i
    }

原地分區(qū)函數(shù) 不占有額外空間又厉,空間復(fù)雜度為O(1),經(jīng)過最后處理后椎瘟,得到的是中間值的和中間值位置覆致,而它的左邊的數(shù)肯定都是比它小的數(shù),當(dāng)然也要知道左邊的數(shù)不一定是排好序的肺蔚,而它的右邊肯定都是比它大或者等于的數(shù)煌妈,右邊的數(shù)也不一定都排好序。舉個例子好理解宣羊。
待排序數(shù)據(jù)是:3 4 2 1 5 3 璧诵。
跑完一次分區(qū)函數(shù)結(jié)果為 2 1 3 4 5 3。
其中i值仇冯,此時是2之宿,是下標(biāo) ,而對應(yīng)的值是3。
遍歷第1輪(i , j  = 0):  3[a] (i,j) 4 2 1 5 3(b) 由于3[a]和3(b)一樣赞枕,所以不交換澈缺,
遍歷第2輪(i = 0 , j  = 1): 3[a] (i) 4(j) 2 1 5 3(b) 由于4大于3(b),所以不交換
遍歷第3輪(i = 0 , j  = 2): 3[a] (i) 4 2(j) 1 5 3(b) 由于2小于3(b)炕婶,所以交換i ,j 值姐赡,同時i + 1
遍歷第4輪(i = 0 , j  = 3): 2 4(i) 3[a] 1(j) 5 3(b) 由于1小于3(b),所以交換i ,j 值柠掂,同時i + 1
遍歷第5輪(i = 0 , j  = 4): 2  1 3[a](i) 4 5(j) 3(b) 由于5大于3(b)项滑,所以不交換
遍歷結(jié)束,最后把最后沒有參與比較的基準(zhǔn)數(shù)和最后取得的i下標(biāo)的值進行交換涯贞,因為此時i值就是給基準(zhǔn)數(shù)的枪狂,相當(dāng)于經(jīng)過交換才真正歸位到正確的位置i
從上面對于相同數(shù)據(jù)3的排序危喉,沒跑函數(shù)前相對位置是3[a]    3[b],而跑完函數(shù)就變成了 3[b]    3[a],說明快速排序不是穩(wěn)定的排序。

結(jié)論:參考穩(wěn)定算法的定義州疾,如果相同的數(shù)辜限,排序前后發(fā)生了交換,那就不是穩(wěn)定的排序算法严蓖,而從上面的分析就可以知道快速排序是不穩(wěn)定的薄嫡。
還有可以發(fā)現(xiàn)快速排序的分區(qū)函數(shù)并沒有使用到臨時數(shù)組,所以它的分區(qū)函數(shù)空間復(fù)雜度是O(1)颗胡,但由于快速函數(shù)外面是通過遞歸調(diào)用的毫深,所以還需要用到遞歸棧空間毒姨,所以經(jīng)過復(fù)雜的計算得到平均整體時間復(fù)雜度為O(logn),最壞是O(logn)哑蔫,最好是O(logn)。

快速排序常見的排序題:
查找無序數(shù)組中弧呐,第k大的數(shù)闸迷,也就是對應(yīng)的下標(biāo)應(yīng)該是k-1

    func quickSortSelectK(_ array: inout Array<Int>, _ left: Int, _ right: Int, _ k: Int) -> Int {
        if left == right {
            return array[left]
        }
        let point = partition(&array, left, right) // 求得的是中間值的下標(biāo)
        let realIndex = k - 1 // 實際要求的下標(biāo)
        if point == realIndex {
            return array[point]
        }else if (point > realIndex) {// point的下標(biāo)比realIndex大,說明真正要找的數(shù)在point的左邊俘枫,需要再對左邊區(qū)間數(shù)據(jù)做一次快速排序
           return quickSortSelectK(&array, left, point - 1,  k) // 注意不包括point
        }else  {// point的下標(biāo)比realIndex小稿黍,說明真正要找的數(shù)在point的右邊,所以需要再對右邊區(qū)間數(shù)據(jù)做一次快速排序
           return quickSortSelectK(&array,  point + 1, right, k)// 注意不包括point
        }
    }
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末崩哩,一起剝皮案震驚了整個濱河市巡球,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌邓嘹,老刑警劉巖酣栈,帶你破解...
    沈念sama閱讀 217,277評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異汹押,居然都是意外死亡矿筝,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評論 3 393
  • 文/潘曉璐 我一進店門棚贾,熙熙樓的掌柜王于貴愁眉苦臉地迎上來窖维,“玉大人,你說我怎么就攤上這事妙痹≈罚” “怎么了?”我有些...
    開封第一講書人閱讀 163,624評論 0 353
  • 文/不壞的土叔 我叫張陵怯伊,是天一觀的道長琳轿。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么崭篡? 我笑而不...
    開封第一講書人閱讀 58,356評論 1 293
  • 正文 為了忘掉前任挪哄,我火速辦了婚禮,結(jié)果婚禮上琉闪,老公的妹妹穿的比我還像新娘迹炼。我一直安慰自己,他們只是感情好颠毙,可當(dāng)我...
    茶點故事閱讀 67,402評論 6 392
  • 文/花漫 我一把揭開白布疗涉。 她就那樣靜靜地躺著,像睡著了一般吟秩。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上绽淘,一...
    開封第一講書人閱讀 51,292評論 1 301
  • 那天涵防,我揣著相機與錄音,去河邊找鬼沪铭。 笑死壮池,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的杀怠。 我是一名探鬼主播椰憋,決...
    沈念sama閱讀 40,135評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼赔退!你這毒婦竟也來了橙依?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,992評論 0 275
  • 序言:老撾萬榮一對情侶失蹤硕旗,失蹤者是張志新(化名)和其女友劉穎窗骑,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體漆枚,經(jīng)...
    沈念sama閱讀 45,429評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡创译,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,636評論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了墙基。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片软族。...
    茶點故事閱讀 39,785評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖残制,靈堂內(nèi)的尸體忽然破棺而出立砸,到底是詐尸還是另有隱情,我是刑警寧澤初茶,帶...
    沈念sama閱讀 35,492評論 5 345
  • 正文 年R本政府宣布仰禽,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏吐葵。R本人自食惡果不足惜规揪,卻給世界環(huán)境...
    茶點故事閱讀 41,092評論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望温峭。 院中可真熱鬧猛铅,春花似錦、人聲如沸凤藏。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽揖庄。三九已至栗菜,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間蹄梢,已是汗流浹背疙筹。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留禁炒,地道東北人而咆。 一個月前我還...
    沈念sama閱讀 47,891評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像幕袱,于是被迫代替她去往敵國和親暴备。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,713評論 2 354

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