一、源**
def sort(ls: list[int]): list[int] =
} }
二、演算法的核心
1)快速排序事先選取乙個元素作為用來比較的基準。比基準大的數放在右邊,比基準小的數放在左邊,一次分成大、小兩類。
2)每一類又通過選取乙個基準再次進行大小的分類。直到左右兩邊沒有資料為止。
三、遞迴的解釋
理解遞迴的關鍵在於先接受它。我們事先暗示自己「sort函式能夠對輸入的列表進行排序」。
按照這種暗示,我們進入sort函式體內,分成兩種情況
1)如果傳入的是nil,則返回nil——沒錯,sort對nil進行的排序。
2)如果傳入的不是nil,sort會將列表ls分解成兩個部分left和right,實際上還有首部tail。然後返回乙個列表——這個列表由排序過的left+首部base+排序後的right。當然sort方法實現了它的承諾,返回的列表是排過序的。
先不要慶幸理解了快速排序,在這之後我們需要跳出這個暗示,說服自己為什麼2)中的sort能夠完成排序(這時候要把內部的自身呼叫看成另外乙個函式)
合理的解釋是sort能夠把傳入列表拆分成左右兩個部分,然後使用乙個拆分函式繼續拆分,直到為nil。這裡的拆分函式還是sort,這個解釋的重點在於「拆分」,而不是排序。換句話說,我們要從2)轉到1)。現在2)過程能轉到1),而1)是可以被接受的。所以,這個遞迴方式是成立的。
其實,我只是想表述,看到sort排序的時候自己心裡是如何想的,後面不知不覺就成了證明,當然這不算乙個證明。我的目的是讓你從上面的描述中感受到遞迴的思想。
快速排序演算法解析
一趟快速排序的演算法是 1 設定兩個變數i j,排序開始的時候 i 0,j n 1 2 以第乙個陣列元素作為關鍵資料,賦值給key,即key a 0 3 從j開始向前搜尋,即由後開始向前搜尋 j 找到第乙個小於key的值a j 將a j 和a i 互換 4 從i開始向後搜尋,即由前開始向後搜尋 i ...
快速排序演算法分析解析
快速排序演算法的時間複雜度和各次標準資料元素的值關係很大。如果每次選取的標準元素都能均分兩個子陣列的長度,這樣的快速排序過程是乙個完全二叉樹結構。即每個結點都把當前陣列分成兩個大小相等的陣列結點,n個元素陣列的根結點的分解次數就構成一棵完全二叉樹 這時分解次數等於完全二叉樹的深度log2n 每次快速...
Scala 說說快速排序
簡短的幾行 就完成了快速排序 def qsort list int list int 這幾行 很美,美不勝收。我喜歡把這種風格裡定義的sqort叫做物件,函式物件 它的型別是list int list int 這是個函式型別,接受乙個list int 引數,返回乙個list int 結果 模式匹配的...