排序-真的了解快速排序了嗎,請解答下題
- 2019 年 10 月 10 日
- 筆記
題目
給出一個區間的集合,請合併所有重疊的區間。 示例:[[1,5],[2,7],[,10,18],[,17,19]] 結果:[[1,7],[10,19]] 為什麼呢?[1,5] [2,7]有重疊3,4;[10,18],[17,19]有重疊17,18
我們分析上面的示例,其實比較的就是下一個區間起始值是否在上一個區間的範圍內,依次比較,直到匹配失敗,就把這個已經匹配過的最小值和最大值放入一個新的區間。
基於上面的思路,我們首先得保證區間是有序的(基於起始值的有序),所以先排序,這裡我們學習一下快速排序演算法。
快速排序
快速排序核心原理是經過一趟排序之後,使得這一組數據在某個值左邊全是小於這個值的,在這個值的右邊全是大於這個值的,然後遞歸排序左邊的數組和右邊數組,直到最後數組的大小是1,排序終止,如下圖,

- 第一次我們選取值為8的元素為中間值,經過一趟排序後,4的左邊是7,2,右邊是15
- 第二次我們對左邊元素7,2,右邊元素15進行排序,選取的中間值分別是7,15
- 第三次排序完成後,2,7有序,15隻有一個元素,右邊的數組終止排序
- 第四次對2,7進行排序,2,7各只有一個元素,終止排序
結合上面的題目我們用程式碼實現快速排序


總結一下快速排序
快速排序是最常用的一種排序演算法,在實際場景中也廣泛用到,比如類庫中(jdk類庫,golang類庫)其排序演算法都有用到快速排序。
- 快速排序使用了遞歸演算法,每次分區之後,數組都會被切分成兩個大小差不多相等的小區間,直到區間大小為1,這個過程需要log(n)次,每個區間進行排序需要遍歷n(數組的結尾-開始)次,所以時間複雜度是nlog(n),極端情況下會退化成n2,例如[1,2,3,4,5],這種情況下,數組是有序的,假設我們選的分區值是1,每次分區後兩個數組的大小差距太大(數組長度-2),,所以需要執行n次分區操作,那麼時間複雜度會退化成n2。
- 他是一種原地排序演算法,不會佔用多餘的空間,排序過程中除了申請一些臨時變數存儲,並無其它任何記憶體開銷,所以空間複雜度是O(1),
- 他是一種不穩定的排序演算法 ,因為在分區函數中會對數據元素做交換
- 快速排序的核心思想是分區和分治,分區時分區的值選取也很關鍵,一般採用中位數
快速排序的平均時間複雜度是nlog(n),其退化到n2的概率是非常小的,我們也可以選取合適的中間值進行避免,但他的原地排序,分治思想是非常優秀的,所以他在實際場景中應用廣泛。
再回到一開始的問題
我們對intervals二位數組按下標為0的元素進行了升序排序,我們按照上面的解題思路開始實現程式碼

