【資料結構與演算法】003—排序演算法(Python)
阿新 • • 發佈:2018-12-27
寫在前面
常見排序演算法可以分為兩大類:
非線性時間比較類排序:通過比較來決定元素間的相對次序,由於其時間複雜度不能突破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]