原理:(公升序)
選取陣列的首個元素做為中間值,快取這個中間值,該位置變為空;
從右到左和中間值對比,找到第乙個小於中間值的元素,把該值放到左邊的空位,該位置變為空;
從左到右和中間值對比,找到第乙個大於中間值的元素,把該值放到右邊的空位,該位置變為空;
重複步驟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 主要思想 通過一趟排序將要排序的資料分割成獨立的兩部分,其中一部分的所有資料都比另外一部分的所有資料都要小,然後再按此方法對這兩部分資料分別進行快速排序,整個排序過程可以遞迴進行,以此達到整個資料變成有序序列。時間複...