Python 實現快排 堆排

2021-09-11 21:39:35 字數 1781 閱讀 6315

原理:(公升序)

選取陣列的首個元素做為中間值,快取這個中間值,該位置變為空;

從右到左和中間值對比,找到第乙個小於中間值的元素,把該值放到左邊的空位,該位置變為空;

從左到右和中間值對比,找到第乙個大於中間值的元素,把該值放到右邊的空位,該位置變為空;

重複步驟2和3,直到左右空位相交,然後把快取的中間值填入該位;

從第4步驟的左右空位相交位為界,分左右兩邊重複1-4步驟,直到需要排序陣列的長度≤1;

程式**:

# 快排

def quick_sort(a, l, r):

if l < r:

pivot = a[l]

left = l

right = r

while left < right:

while a[right] > pivot and left < right:

right -= 1

# 左右不能相等,相等的話會進行移動,導致陣列越界

if left < right:

a[left] = a[right]

left += 1

while a[left] <= pivot and left < right:

left += 1

if left < right:

a[right] = a[left]

right -= 1

a[left] = pivot

quick_sort(a, l, left-1)

quick_sort(a, left+1, r)

if __name__ == '__main__':

s = [0, 2, 1, 6]

quick_sort(s, 0, 3)

print(s)

原理(用陣列表示完全二叉樹的層序,最小堆):

從最後乙個葉子節點的父節點開始,比較該節點與子節點的大小;

如果父節點是最小值,繼續比較前面的節點;如果父節點不是最小值,父節點與最小值節點交換位置,並且考慮該變換對最小值節點的子節點的影響;

直到比較到根節點

程式**:

# 堆排

def heap_sort(a):

for i in range((len(a) - 1) // 2, -1, -1):

while i < len(a):

# 子節點與父節點的位置關係

left, right = i * 2 + 1, i * 2 + 2

min_pos = i

if (left < len(a)) and (a[left] < a[min_pos]):

min_pos = left

if (right < len(a)) and (a[right] < a[min_pos]):

min_pos = right

# 如果最小值的位置改變了,需要考慮這個改變帶來的影響

if min_pos != i:

a[i], a[min_pos] = a[min_pos], a[i]

i = min_pos

else:

break

if __name__ == '__main__':

s = [4, 3, 2, 1]

heap_sort(s)

print(s)

good luck!

快排和堆排

一 快速排序 最常用的排序演算法,速度通常也是最快的。時間複雜度 o nlogn 最壞 o n 2 空間複雜度 o nlgn 不穩定 比如 5 3 3 4 3 8 9 10 11 這個序列,在中樞元素5和3交換就會把元素3的穩定性打亂 實現原理 快排主要是通過選擇乙個關鍵值作為基準值。比基準值小的都...

快排 歸併 堆排

快排 include include include includeusing namespace std void quicksort vector a,int l,int r 終止遞迴的條件,子串行長度為1 int mid low high low 2 取得序列中間的元素 mergesort a...

快排與堆排

本文複習一下快速排序和堆排序 2 種排序演算法 為了多快好省地刷 leetcode 主要思想 通過一趟排序將要排序的資料分割成獨立的兩部分,其中一部分的所有資料都比另外一部分的所有資料都要小,然後再按此方法對這兩部分資料分別進行快速排序,整個排序過程可以遞迴進行,以此達到整個資料變成有序序列。時間複...