簡潔版本的快排和歸併排序

2021-10-24 06:20:42 字數 1565 閱讀 9962

#最簡潔的快排序,遞迴出口–low=high low>=high

def

quick_sort

(nums, low, high)

:if low >= high:

return

left = low

right = high

pivot = nums[left]

while left < right:

while left < right and pivot <= nums[right]

: right -=

1 nums[left]

,nums[right]

= nums[right]

,nums[left]

while left < right and pivot > nums[left]

: left +=

1 nums[left]

, nums[right]

= nums[right]

, nums[left]

nums[left]

= pivot

quick_sort(nums, low, left-1)

quick_sort(nums, left+

1, high)

#最簡潔的歸併排序

def

merge

(left, right)

: l,r =0,

0 result =

while l <

len(left)

and r <

len(right)

:if left[l]

< right[r]:)

l +=

1else:)

r +=

1 result += left[l:

] result += right[r:

]return result

defmerge_sort

(nums):if

len(nums)

<=1:

return nums

mid =

len(nums)//2

left = merge_sort(nums[

:mid]

) right = merge_sort(nums[mid:])

return merge(left, right)

思想:

快速排序:不穩定的排序演算法,原地操作(不斷的更換區間進行遞迴)

最優時間複雜度:o(nlog(n))

最壞時間複雜度:o(n^2)

歸併排序:穩定的排序演算法,分治的思想

先拆:使用遞迴不斷的拆分序列–遞迴的出口就是序列只有乙個元素的情況

後和:從上面遞迴的最底層開始合併(從內向外到最終排序好的序列返回)

最優時間複雜度:o(nlog(n))

最壞時間複雜度:o(nlog(n))

快排 歸併排序

二 歸併排序 遞迴 分治的思維 分治 確定分界點 我們下面以中間值q l r 1 為分界點,理論上任何點作為分界點都可 調整區間 x 的在左邊,x的在右邊 兩個區間 遞迴 遞迴處理左右兩段 原題鏈結 題目描述 給定你乙個長度為n的整數數列。請你使用快速排序對這個數列按照從小到大進行排序。並將排好序的...

快排和歸併排序講解

快速排序 歸併排序 找陣列的最後乙個數字,假設為number,然後number為標準,調整陣列 陣列左邊是小於number的數,中間是等於number的數,右邊是大於number的數,然後對小於number的部分繼續進行上述操作,對大於number的部分繼續進行上述操作。這是普通的快速排序,和資料的...

單鏈表排序 快排和歸併排序

題目描述 給定乙個亂序的單鏈表的頭節點,對該鍊錶中的節點進行排序 要求時間複雜度為o nlgn 空間複雜度為o 1 分析 由於題目要求時間複雜度我o nlgn 因此選擇排序和插入排序可以排除。在排序演算法中,時間複雜度為o nlgn 的主要有 歸併排序 快速排序 堆排序。其中堆排序的空間複雜度為 n...