參考:https://wiki.jikexueyuan.com/project/easy-learn-algorithm/xiaohen-buy-book.html
常用的排序算法有:
- 桶排序
- 冒泡排序
- 快速排序
- 堆排序
1、桶排序:好多桶。時間複雜度爲O(m+n),空間複雜度爲O(max(nums)+1)
#打印出得分[5, 3, 2, 5, 8]
#10爲總分數
#堆排序
def backet_sort(nums):#時間複雜度O(m+n)
res = []
size = len(nums)
if size < 2:
return nums
backet = [0 for _ in range(10+1)]
for n in nums:
backet[n] += 1
#從小到大
# for i in range(10+1):
#從大到小
for i in range(10, -1, -1):
l = backet[i]
for j in range(l):
res.append(i)
return res
# print(backet_sort([5, 3, 2, 5, 8]))
2、冒泡排序:有點像排大合照站隊形;時間複雜度O(n2),空間複雜度O(1)
#冒泡排序
def bulling_sort(nums):
size = len(nums)
if size < 2:
return nums
for i in range(size-1):#第i次排位
p = 0
for j in range(1, size):#比較j次
if nums[p] < nums[j]:
tmp = nums[p]
nums[p] = nums[j]
nums[j] = tmp
p += 1
return nums
# print(bulling_sort([35, 12, 99, 18, 76]))
3、快排:找基準值,兩個左右兩個指針相遇;時間複雜度O(nlogn),空間複雜度爲O(1).
#快排
def quick_sort(nums):
size = len(nums)
if size < 2:
return nums
pivot = nums[0]
i = 0
j = size - 1
while i < j:
if nums[j] > pivot:
j -= 1
else:
if nums[i] > pivot:
tmp = nums[i]
nums[i] = nums[j]
nums[j] = tmp
else:
i += 1
tmp = nums[i]
nums[i] = pivot
nums[0] = tmp
return quick_sort(nums[:i]) + [pivot] + quick_sort(nums[i+1:])
print(quick_sort([6, 1, 2, 7, 3, 4, 5, 10, 8]))