1. 程式人生 > 實用技巧 >【排序】

【排序】

選擇排序:
選擇排序的基本思想是:如果有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)

不穩定的排序演算法:一堆希爾快選