資料結構(9 快速排序

2021-10-01 03:12:20 字數 2273 閱讀 2927

思路:

對於陣列 [ 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...