1. 程式人生 > >【資料結構與演算法】003—排序演算法(Python)

【資料結構與演算法】003—排序演算法(Python)

寫在前面

常見排序演算法可以分為兩大類:

  • 非線性時間比較類排序:通過比較來決定元素間的相對次序,由於其時間複雜度不能突破O(nlogn),因此稱為非線性時間比較類排序。

  • 線性時間非比較類排序:不通過比較來決定元素間的相對次序,它可以突破基於比較排序的時間下界,以線性時間執行,因此稱為線性時間非比較類排序。

排序複雜度

類別 名稱 時間複雜度 穩定性
插入排序 插入排序(insertion sort) O(n2) 穩定
插入排序 希爾排序 (shell sort) O(nlogn) 不穩定
選擇排序 選擇排序(selection sort) O(n2) 不穩定
選擇排序 堆排序 (heapsort) O(nlogn) 不穩定
交換排序 氣泡排序(bubble sort) O(n2) 穩定
交換排序 快速排序(quicksort) O(nlogn) 不穩定
歸併排序 歸併排序 (merge sort) O(nlogn) 穩定
基數排序 基數排序(radix sort) O(n+k) 穩定

氣泡排序

它重複地走訪過要排序的元素列,依次比較兩個相鄰的元素,如果他們的順序(如從大到小、首字母從A到Z)錯誤就把他們交換過來。

def bubbleSort(nums):
    for i in range(len(nums) - 1):
        for j in range(len(nums) - i - 1):
            if nums[j] > nums[j + 1]:
                nums[j], nums[j + 1] = nums[j + 1], nums[j]
    return nums

nums = [2, 1, 34, 4, 6, 3, 6]
result = bubbleSort(nums)
print(result)

[1, 2, 3, 4, 6, 6, 34]

選擇排序

每一次從待排序的資料元素中選出最小(或最大)的一個元素,存放在序列的起始位置,

然後,再從剩餘未排序元素中繼續尋找最小(大)元素,然後放到已排序序列的末尾。以此類推,直到全部待排序的資料元素排完。

def selectSort(nums):
    for i in range(len(nums) - 1):
        index = i
        for j in range(i + 1, len(nums)):
            if nums[j] < nums[index]:
                index = j
        if index != i:
            nums[i], nums[index] = nums[index], nums[i]
    return nums

nums = [2, 1, 34, 4, 6, 3, 6]
result = selectSort(nums)
print(result)

[1, 2, 3, 4, 6, 6, 34]

插入排序

每步將一個待排序的記錄,按其關鍵碼值的大小插入前面已經排序的檔案中適當位置上,直到全部插入完為止。

時間複雜度:O(n^2).

def insertSort1(nums):
    for i in range(1, len(nums)):
        index = nums[i]
        j = i - 1
        while j >= 0 and nums[j] > index:
            nums[j+1] = nums[j]
            j-=1
        nums[j+1] = index
    return nums

nums = [2, 4, 1 ,0, 4, 3, 2, 5]
result = insertSort1(nums)
print(result)

[0, 1, 2, 2, 3, 4, 4, 5]

下面方法會遍歷到nums[-1],如果nums[-1] > index則進行交換,但是迴圈結束,nums[0]仍會賦值為index

def insertSort(nums):
    for i in range(1, len(nums)):
        index = nums[i]
        for j in range(i, -1, -1):
            if index < nums[j - 1]:     #該方法會遍歷到nums[-1],如果nums[-1] > index則進行交換,但是迴圈結束,nums[0]仍會賦值為index
                nums[j]= nums[j - 1]
            else:
                break
        nums[j] = index
    return nums

nums = [2, 4, 1 ,0, 4, 3, 2, 5]
result = insertSort(nums)
print(result)

[0, 1, 2, 2, 3, 4, 4, 5]

持續更新中..,