排序演算法(一) 快速排序

2021-07-08 19:49:24 字數 1434 閱讀 6790

突然覺得在本科的時候自己的基本功練習的不是很過關,趁著學python的熱乎勁好好把基礎演算法過一過,等以後面試的時候也不會死的太慘。。。

快速排序(quicksort):

快速排序的可以說是在資料量較大且資料夠隨機的情況下,平均時間複雜度最好的演算法,如果你沒辦法判斷待排序資料的隨機度和規模,用quicksort就對了。

最大時間複雜度o(n^2),平均時間複雜度o(n*logn)

講解排序 l=[6,5,3,4,8,9,7,2,8]:

1.以上面的列表為待排序數字進行從小到大從左到右的排列,首先要設定兩個標誌位i,j,i指向第乙個數字6,j指向最後乙個數字8。

2.下面進行迴圈:首先保持左側標誌位i位置不變,對j操作,看l[j]的數值,如果l[i]>l[j],則交換兩個數(i和j不交換,i永遠在j的左側),並j--;然後保持j不變,對i操作,看l[i]的數值,如果l[i]>l[j],則交換兩數,並i++。然後重複該迴圈,直到i==j為止。

3.進行遞迴:設flag=l[i]]=l[j],經過一輪迴圈(我使用的是while迴圈)之後,flag左側的數都比flag小,右側的都比flag大,因此將序列分成l[0:i-1],l[i+1,len(l)-1]分別處理,這裡要設定start和end,因為每次要處理的序列的起點終點都不一樣。

4.遞迴的終止條件:當i>=j時break

原始碼(python):

def quicksort(list, start, end):

i = start

j = end

while ilist[j]:

flag = list[i]

list[i] = list[j]

list[j] = flag

while ilist[j]:

flag = list[i]

list[i] = list[j]

list[j] = flag

break

else:

i = i+1 #左側下標+1

else:

j = j-1 #右側下標-1

quicksort(list, start, i-1)

quicksort(list, i+1, end)

我有呼叫了乙個python自帶的sorted()演算法,書裡寫的sort()演算法用的是歸併排序,sorted演算法也應該是歸併排序吧......

執行時間如下:

我需要冷靜

目前已經是最優化的quicksort了,但是還是比系統函式慢,慢了整整一百倍,不知道別的語言寫是不是也是這個效果......

排序演算法一 快速排序

package math 快速排序 思路 使用兩個座標指標low,high 和基準值 key為第乙個值 low 初始化時設定序列的頭和尾為low,high。從high開始比較key,如果比key小則交換位置,然後從low比較key如果大於key則交換位置 如此反覆執行 author cyd publ...

排序演算法之一 快速排序

1 先從數列中取出乙個數作為基準數。2 分割槽過程,將比這個數大的數全放到它的右邊,小於或等於它的數全放到它的左邊。3 再對左右區間重複第二步,直到各區間只有乙個數。1 預排序的輸入非常常見,因此不要選擇第乙個數作為基準數 2 隨機數的生成也較為昂貴 3 採用三數中值分割法 取左中右三個元素的中值作...

排序演算法(一) 快速排序 quicksort

在陣列中任取乙個元素作為樞紐元 pivot 將陣列中除了樞紐元以外的元素劃分成兩個集合 乙個集合 s1 中的元素大於樞紐元,另乙個集合 s2 中的元素小於樞紐元。對兩個集合分別進行 quicksort 遞迴 最後返回較小數集合 樞紐元 較大數集合的陣列。平均執行時間為 o n log n 最長執行時...