【排序】
阿新 • • 發佈:2021-01-03
選擇排序:
選擇排序的基本思想是:如果有N個元素需要排序,那麼首先從N個元素中找到最小的那個元素與第0位置上的元素交換(說明一點,如果沒有比原本在第0位置上的元素小的就不用交換了,後面的同樣是),然後再從剩下的N-1個元素中找到最小的元素與第1位置上的元素交換,之後再從剩下的N-2個元素中找到最小的元素與第2位置上的元素交換,直到所有元素都排序好(也就是直到從剩下的2個元素中找到最小的元素與第N-2位置上的元素交換)。
時間複雜度:最好、最壞、平均 都是 O(N^2)
def select_sort(nums): for i in range(len(nums)): for j in range(i, len(nums)): if nums[j] < nums[i]: nums[j], nums[i] = nums[i], nums[j] return nums
氣泡排序:
氣泡排序需要兩兩元素進行比較,如果是升序排序,每一輪總會把最大的元素放在陣列末尾。第一層for迴圈,leng-1表示需要進行交換的輪數,第二次for迴圈,j記錄了交換兩個元素的下標。下邊範圍每一輪都會減少。因為每次都把這一輪的最大元素放在後面。
平均情況和最壞情況O(N^2),最好情況,有序的時候不用交換O(N)。
def bubble_sort(nums): for i in range(len(nums) - 1, -1, -1): for j in range(i): if nums[j + 1] < nums[j]: nums[j + 1], nums[j] = nums[j], nums[j + 1] return nums
快速排序:
空間複雜度:O(n) 因為遞迴實現需要佔用記憶體
平均時間複雜度:O(nlogn) ,最壞時間複雜度:O(N^2)
def quick_sort(nums, left, right): if left < right: base = partition(nums, left, right) quick_sort(nums, left, base - 1) quick_sort(nums, base+1, right) return nums def partition(nums, left, right): pivot = nums[left] while left < right: while left < right and nums[right] >= pivot: right -= 1 nums[left] = nums[right] while left < right and nums[left] <= pivot: left += 1 nums[right] = nums[left] nums[left] = pivot return left
堆排序:
時間複雜度:平均和最壞都是O(nlogn)
def heap_sort(nums):
build_heap(nums)
for i in range(len(nums)-1,-1,-1):
nums[0],nums[i] = nums[i],nums[0]
heapfy(nums,0,i)
return nums
def build_heap(nums):
for i in range((len(nums)-1)//2,-1,-1):
heapfy(nums,i,len(nums))
def heapfy(nums,i,length):
left = 2*i+1
right = 2*i+2
if left<length and nums[left]>nums[i]:
large = left
else:
large = i
if right<length and nums[right]>nums[large]:
large = right
if i!=large:
nums[i], nums[large] = nums[large], nums[i]
heapfy(nums,large,length)
不穩定的排序演算法:一堆希爾快選