思路:
對於陣列 [ 54,26,93,17,77,31,44,55,20]
先制定乙個基準 a[0]=54-----這裡基準一般取第乙個值
設定兩個指標 low=1 high=n-1 需要對所有數進行遍歷
要求:
low從左向右遍歷,low指向的數都比a[0]小,
high從右向左遍歷,high指向的值都比a[0]大
low和a[0]比較有兩種結果,對應不同的處理
1.a[low]如果比a[0]大:
low不動,
(1)將low的值賦給high
(2)然後讓high往左移動
2.a[low]如果比a[0]小:
(1)low繼續右移
使用while實現為:
while lowlow+=
1 a[high]
=a[low]
1.a[high]如果比a[0]小:
high不動
(1)將high的值賦給low
(2)然後讓low右移
2. a[high]如果比a[0]大:
(1)high繼續左移
使用while實現為:
while low < high and a[high]
>=mid:
high -=
1 a[low]
= a[high]
while low退出這個迴圈後 low=high ,此時a[low]
=a[high]
就是這個基準值,a[low]
=mid
如果只執行一次,那麼只是按照第乙個基準值,將基準值分為比它大和小的兩撥資料,此時中間節點是 low
low左側按照上面迴圈,為quick_sort(a,first,low-1)
low 右側按照上面迴圈,為 quick_sort(a,low+1,last)
最優時間複雜度:
o(nlogn)
每次資料都是一分為2,共有 logn次
每次比較n個數,所以時間複雜度為 o(nlogn)
實現**如下:
def
quick_sort
(a,first,last)
:# 當開始索引》=結束索引時,不再進行遞迴 只剩下乙個元素
if first>=last:
return
mid = a[first]
low,high=first,last
while low# 交替遍歷high,這裡注意:為什麼要加一層low=mid ,會 high向左移動,然後賦值,然後執行下面,low向右移動,low和high間隔會越來越大,
# 如果執行了賦值,下面的繼續操作,又執行了賦值,等於沒操作,退出
while low < high and a[high]
>=mid:
# 當high對應值大於mid的值 high向左移動,否則 將high的值賦給low
high -=
1 a[low]
= a[high]
# 遍歷low
while low# 當low對應值小於mid的值 low向右移動,否則 將low的值賦給high
low+=
1 a[high]
=a[low]
a[low]
=mid
quick_sort(a,first,low-1)
quick_sort(a,low+
1,last)
list=[
6,3,
7,2,
9,1]
quick_sort(
list,0
,len
(list)-
1)print
("快排後的list為:"
,list
)
輸出結果為:
快排後的list為: [1,
2,3,
6,7,
9]
資料結構 排序 快速排序
對序列 47,31,83,91,57,18,96,16 進行快速排序 首元素為基準 第二趟排序結果是 正確答案 b 你的答案 c 錯誤 18 31 16 47 57 91 96 83 16 31 18 47 57 91 96 83 16 18 31 47 57 91 96 83 16 18 31 4...
資料結構 排序 快速排序
快速排序在平均情況下是效果最好的排序演算法 每趟子表的排序都是從兩頭向中間交替逼近,接下來舉乙個例子 sorry,上面這個圖的6和5的位置畫反啦,快速排序全域性有序,一趟排序便可以確定基準值的最終位置 類別排序方法 最好時間 最壞時間 平均時間 空間複雜度 穩定性序列特徵 適用於插入排序 直接插入排...
資料結構排序 快速排序
快速排序是對氣泡排序的改進,它的基本思想是通過一趟排序將資料分成兩部分,一部分中的資料都比另一部分中的資料小,再對這兩部分中的資料再排序,直到整個序列有序,如下圖所示。快排的遞迴實現 1 include 2 include 3 4intn 5 6 7 分割使樞軸記錄的左邊元素比右邊元素小8 9int...