#最簡潔的快排序,遞迴出口–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...