[关闭]
@Scrazy 2017-04-05 06:45 字数 1761 阅读 942

Sorts

python


快排

  1. import random
  2. def quick_sort(L):
  3. if len(L) < 2:
  4. return L
  5. mid = random.choice(L)
  6. left = [x for x in L if x < mid]
  7. right = [x for x in L if x >= mid]
  8. return quick_sort(left) + quick_sort(right)
  9. if __name__ == '__main__':
  10. L = [random.randrange(100) for _ in range(10)]
  11. print(insert_sort(L))

插入排序

  1. import random
  2. def insert_sort(L):
  3. '''
  4. 平方级算法
  5. '''
  6. if len(L) < 2:
  7. return L
  8. for i in range(1, len(L)):
  9. tmp = L[i]
  10. j = i - 1
  11. while j >= 0 and L[j] > tmp:
  12. L[j+1] = L[j]
  13. j = j - 1
  14. L[j+1] = tmp # 把tmp赋值给索引最小且值大于tmp的元素
  15. return L
  16. if __name__ == '__main__':
  17. '''
  18. ```python
  19. 每次循环的结果,简单表示下
  20. 假设 L = [5, 7, 4, 6, 3]
  21. i = 1 -> [5, 7, 4, 6, 3]
  22. i = 2 -> [5, 7, 7, 6, 3] -> [5, 5, 7, 6, 3] -> [4, 5, 7, 6, 3]
  23. i = 3 -> [4, 5, 7, 6, 3] -> [4, 5, 7, 6, 3] -> [4, 5, 6, 7, 3]
  24. i = 4 -> [3, 4, 5, 6, 7]
  25. ```
  26. '''
  27. L = [random.randrange(100) for _ in range(10)]
  28. print(insert_sort(L))

希尔排序

插入排序最耗时的莫过于最前面的某个比较大的数被一步步的移动到数组的后面。而希尔排序可以以较大的步长移动数字,提高性能。

  1. def shell_sort(seq):
  2. if len(seq) < 2:
  3. return seq
  4. n = len(seq)
  5. mid = n // 2
  6. while mid > 0:
  7. for i in range(mid, n):
  8. tmp = seq[i]
  9. j = i
  10. while j >= mid and seq[j-mid] > tmp:
  11. seq[j] = seq[j-mid]
  12. j -= mid
  13. seq[j] = tmp
  14. mid = mid // 2
  15. return seq

冒泡排序

  1. import random
  2. def bubble(L):
  3. if len(L) < 2:
  4. return L
  5. for n in range(len(L)):
  6. for i in range(len(L) -1):
  7. if L[i] > L[i+1]:
  8. L[i], L[i+1] = L[i+1], L[i]
  9. return L
  10. if __name__ == '__main__':
  11. '''
  12. 复杂度为n ** 2
  13. '''
  14. L = [random.randrange(100) for _ in range(10)]
  15. print(bubble(L))

归并排序

  1. from random import randrange
  2. def merge_sort(seq):
  3. mid = len(seq) // 2
  4. lft, rgt = seq[:mid], seq[mid:]
  5. if len(lft) > 1:
  6. lft = merge_sort(lft)
  7. if len(rgt) > 1:
  8. rgt = merge_sort(rgt)
  9. res = []
  10. while lft and rgt:
  11. if lft[-1] >= rgt[-1]: #取lft和rgt序列中最大的值
  12. res.append(lft.pop())
  13. else:
  14. res.append(rgt.pop())
  15. res.reverse() # 反序一下
  16. return (lft or rgt) + res
  17. if __name__ == '__main__':
  18. seq = [randrange(100) for _ in range(10)]
  19. print(merge_sort(seq))

选择排序

  1. def sel_sort(seq):
  2. '''
  3. 平方级算法
  4. '''
  5. for i in range(len(seq)-1, 0, -1):
  6. max_j = i # 预设最大值索引 max_j
  7. for j in range(i):
  8. if seq[j] > seq[max_j]:
  9. max_j = j # 实际最大的 max_j
  10. seq[i], seq[max_j] = seq[max_j], seq[i] # 交换最大值
  11. return seq
  12. if __name__ == "__main__":
  13. seq = [5, 3, 6, 9, 8, 2]
  14. print(sel_sort(seq))
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注