排序算法-04快速排序(Python实现)
生活随笔
收集整理的這篇文章主要介紹了
排序算法-04快速排序(Python实现)
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
快速排序
性質(zhì)
一種基本的交換排序算法,比較常用的排序算法,簡(jiǎn)稱(chēng)快排。
基本的排序思路如下。基本思想為:通過(guò)一趟排序?qū)⒁判虻臄?shù)據(jù)分割成獨(dú)立的兩部分,分割點(diǎn)左邊的數(shù)都比它小,分割點(diǎn)右邊的數(shù)都比它大,然后再按照這個(gè)方法對(duì)兩部分?jǐn)?shù)據(jù)進(jìn)行排序,顯然這是一個(gè)遞歸過(guò)程。
算法詳解
- 待排序列為2,4,5,1,3。
- 第一步,確定兩個(gè)指針?lè)謩e指向序列第一個(gè)元素為left和序列最后一個(gè)元素為right,并且首先指定第一個(gè)數(shù)為參考元素base。(left指向2,right指向3,base指2)
- 第二步,從右至左掃描,偏移right指針,尋找比base小的元素,找到后將其值賦值給left指針。(找到比base小的數(shù)值為1,將其賦值給left位置,此時(shí)序列變?yōu)?,4,5,1,3)
- 第三步,從左至右掃描,偏移left指針,尋找比base大的元素,找到后將其值賦值給right指針。(找到比base大的數(shù)值4,將其賦值給right,此時(shí)序列為1,4,5,4,3)
- 第四步,不斷重復(fù)二三兩步,直到left和right指針位置重合,此時(shí)所有元素均被掃描了一遍,將base值賦值給重合的位置。此時(shí),已經(jīng)完成了一輪排序,base(2)左邊都是比它小的,右邊都是比它大的。(此時(shí)序列為1,2,5,4,3)
- 第五步,以base數(shù)為分割點(diǎn),兩側(cè)分別進(jìn)行前四步。遞歸下去,完成排序。
算法分析
復(fù)雜度如下。
| 快速排序 | O(nlogn) | O(n^2) | O(nlogn) |
當(dāng)數(shù)據(jù)有序時(shí),以第一個(gè)關(guān)鍵字為分割點(diǎn),一邊為空,效率最差。
數(shù)據(jù)隨機(jī)分布,左右數(shù)量相當(dāng),效率最好。
顯然,數(shù)據(jù)越隨機(jī)分布,快排效果越好,越接近有序,效果越差。
快排相同元素可能交換位置,所以是不穩(wěn)定的排序。
代碼實(shí)現(xiàn)
def QuickSort(data=[1, 2, 3, 4, 5], left=0, right=1):def divide(inputList, left, right):'''根據(jù)left和right進(jìn)行一次掃描,找到新的base:param inputList::param left::param right::return:新base位置'''base = inputList[left]while left < right:while left < right and inputList[right] >= base:right -= 1inputList[left] = inputList[right]while left < right and inputList[left] <= base:left += 1inputList[right] = inputList[left]inputList[left] = basereturn leftif left < right:baseIndex = divide(data, left, right)QuickSort(data, left, baseIndex-1)QuickSort(data, baseIndex+1, right)if __name__ == '__main__':testData = [2, 4, 5, 1, 3]print("Raw Data:", testData)QuickSort(testData, 0, len(testData)-1)print("After Sort:", testData)具體可以查看我的github。?
總結(jié)
以上是生活随笔為你收集整理的排序算法-04快速排序(Python实现)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 排序算法-03希尔排序(python实现
- 下一篇: 排序算法-05简单选择排序(python