之前的部落格記錄過各種排序
快排演算法**如下,該方法思路很直接也很清晰,但是在生成left和right時會需要新的空間,所以其空間複雜度要高一些。
def
quick_sort
(li):if
len(li)
<2:
return li
tmp = li[0]
#快排中將序列分為左右的值
left =
[x for x in li if x < tmp]
middle =
[x for x in li if x == tmp]
right=
[x for x in li if x > tmp]
return quick_sort(left)
+ middle + quick_sort(right)
上面方式實現的快速排序所需要的空間複雜度會高,在面試時手撕快排時,面試官讓換一種方法寫,也就是不斷原地互動從而達到排序效果。
def
quick_sort
(li, first, last)
:if first >= last:
return
mid_value = li[first]
low = first
high = last
while low < high:
while low < high and li[high]
>= mid_value :
high -=
1 li[low]
= li[high]
while low < high and li[low]
<= mid_value :
low +=
1 li[high]
= li[low]
li[low]
= mid_value #此時退出迴圈,low和high重合
quick_sort(li, first, low-1)
#這裡不能用切片,因為切片就產生了新的list,並不會在原list上排序
quick_sort(li, low+
1, last)
return li
快排的兩種寫法
快速排序,原理很簡單就是在資料找乙個定點數,把小於這個數的數放到其左邊,大於這個定點數的數放到其右邊,再把左邊的數,右邊的數再按這種方式來排序,直至無數可排.先實現,不求空間消耗,把小於定點的數放乙個陣列 b,把大於定點的數的放乙個陣列 c,再把它們拷回陣列 a int quick sort int...
快排的兩種partition函式
partition函式就是快排的關鍵部分,作用是將陣列劃分成兩部分,左邊小於基數,右邊大於基數 但實際上它也不僅僅用於快排,在求top k 問題中也常常會用到。下面介紹兩種partition函式,他們都是雙指標的方法,但具體會有差異 函式一 頭尾指標向中間夾 def partition array,...
快速排序 快排 演算法的C 兩種實現
快排演算法在分治的時候有兩種實現,一種實現是從兩邊到中間 partition 另一種實現是從一邊到另一邊 partition2 我用乙個100000陣列測試發現前一種實現執行速度快一些。這兩種的c 實現如下 注 我用的 風格是gnu的 風格 bool sort qsort int ini,int s...