QuickSort 快速排序

殷老實發表於2016-12-02

快速排序 - QuickSort 

    最壞情況是 O(n^2) , 平均是 O(n*logn) 但是儘管 堆排序的執行時間 是保證在 O(n*logn), 但是在實際中快速排序的執行時間往往是快於堆排序的。

    快速排序也是in-place的排序。


原理:


快速排序 的原理就是選定一個點作為軸心點 - pivot, 初始是從 陣列的第一個元素開始,一直到 倒數第二個元素,挨個與pivot的值進行比較,將小於或者等於pivot的值,換到當前走過的並且小於等於pivot的最近位置的下一位 ( 預設我們的開始索引位-1). 當到達倒數第二個元素後, 我們需要將 我們走過的離pivot最近的並且值小於等於pivot的元素的下一位 q-position 與pivot進行交換. 這個過程被稱為partition .  之後進行遞迴操作 - quicksort (Array, start, q-position - 1);  quicksort(Array, q-position + 1, end)


     partition 的步驟

      例如: 2, 8, 7, 1, 3, 5, 6, 4.   (pivot為4 - 我的程式中預設初始pivot為陣列中最後一個值) 

               將小於等於4的數進行交換,從2開始,2小於4,當前我們走過的離4最近的值的下一位與2進行交換 - (因為預設的索引為-1, 下一位的索引就是0 對應的值就是2),當前走到2,所以2不變, 繼續走

                8,7 都不小於4, 當我們來到值1 的時候,滿足條件,將1 和 當前我們走過的,並且小於等於4的值的下一位進行交換,也就是8. 將 8 和 1交換 

                交換之後的陣列位 2, 1, 7, 8, 3, 5, 6, 4.  重複 直到倒數第二個元素, 得到  2, 1, 3,  8, 7, 5, 6, 4

               然後,需要將我們走過的離pivot最近並且小於等於pivot的元素的下一位與pivot進行交換得 2, 1, 3, 4, 7, 5, 6, 8

                


程式碼實現的連結GitHub



有問題歡迎指出!


相關文章