資料結構36 快速排序

2021-10-24 18:26:05 字數 2520 閱讀 2648

目錄

一、快速排序

二、快速排序:圖示

三、快速排序:演算法分析

快速排序的思路是依據乙個「中值」資料項把資料表分為兩半:小於中值的一半和大於中值的一半,然後每部分分別進行快速排序(遞迴)。

如果希望這兩半擁有相等數量的資料項,則應該找到資料表中的「中位數」,但是找中位數的過程需要計算開銷,要想沒有開銷,只能隨意找乙個數充當中值,比如第乙個數

快速排序的遞迴演算法「遞迴三要素」為:

**資料表的目標:找到「中值」的位置。

**資料表的手段:

左標一直向右移動,碰到比中值大的就停止。

右標一直向左移動,碰到比中值小的就停止。

然後把左右標所指的資料項交換。

if first < last: #基本結束條件

splitpoint = partition(alist, first, last) # **

quicksorthelper(alist, first, splitpoint-1)

quicksorthelper(alist, splitpoint+1, last)

def partition(alist, first, last):

pivotvalue = alist[first] # 選定中值

# 左右標初值

leftmark = first + 1

rightmark = last

done = false

while not done:

# 向右移動左標

while leftmark <= rightmark and alist[leftmark] <= pivotvalue:

leftmark += 1

# 向左移動右標

while rightmark >= leftmark and alist[rightmark] >= pivotvalue:

rightmark -= 1

if rightmark < leftmark:

# 兩標向錯就結束移動

done = true

else:

# 左右標的值交換

alist[leftmark], alist[rightmark] = alist[rightmark], alist[leftmark]

# 中值就位

alist[first], alist[rightmark] = alist[rightmark], alist[first]

return rightmark

另一種實現:

def quick_sort(alist, start, end):

if start >= end:

return

left, right = start, end

mid = alist[left]

while left < right:

while left < right and alist[right] > mid:

right = right -1

alist[left] = alist[right]

print(left, right, alist, '*')

while left < right and alist[left] < mid:

left += 1

alist[right] = alist[left]

# alist[left], alist[right] = alist[right], alist[left]

print(left, right, alist)

alist[left] = mid

quick_sort(alist, start, left-1)

quick_sort(alist, left+1, end)

return alist

alist = [5, 4, 8, 7, 9, 2]

# alist = [5, 6, 4, 2]

print(quick_sort(alist, 0, len(alist)-1))

如果**總能把資料表分為相等的兩部分,那麼就是o(long n)的複雜度。

而移動需要將每項都與中值進行比對,還是o(n)

可以參考:

資料結構 排序 快速排序

對序列 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...