当前位置:   article > 正文

python排序算法(一)、冒泡排序、选择排序、插入排序_python冒泡、选择、插入排序

python冒泡、选择、插入排序

排序:将一组”无序“的记录序列调整为”有序”的记录序列

列表排序:将无序列表变为有序列表

  •   输入:列表
  •   输出:有序列表

升序和降序

内置排序函数:sort()

1、冒泡排序 

  • 列表每两个相邻的数,如果前面比后面大,则交换这两个数
  • 一趟排序完成后,则无序区减少一个数,有序区增加一个数
  • 代码关键点:
    • 无序区范围

示意图 

 代码

  1. def bubble_sort(li):
  2. for i in range(len(li) - 1): # 趟数(n-1)
  3. for j in range(len(li) - i - 1):
  4. if li[j] > li[j + 1]:
  5. li[j], li[j + 1] = li[j + 1], li[j]
  6. print("第%s趟" % i, li)
  7. li = [9, 8, 7, 1, 2, 3, 4, 5, 6]
  8. print(li)
  9. bubble_sort(li)
  10. # 结果
  11. [9, 8, 7, 1, 2, 3, 4, 5, 6]
  12. 0趟 [8, 7, 1, 2, 3, 4, 5, 6, 9]
  13. 1趟 [7, 1, 2, 3, 4, 5, 6, 8, 9]
  14. 2趟 [1, 2, 3, 4, 5, 6, 7, 8, 9]
  15. 3趟 [1, 2, 3, 4, 5, 6, 7, 8, 9]
  16. 4趟 [1, 2, 3, 4, 5, 6, 7, 8, 9]
  17. 5趟 [1, 2, 3, 4, 5, 6, 7, 8, 9]
  18. 6趟 [1, 2, 3, 4, 5, 6, 7, 8, 9]
  19. 7趟 [1, 2, 3, 4, 5, 6, 7, 8, 9]

由结果看出,不管是有序列表还是无序列表,该冒泡排序代码,都会排序n-1次,所以我们可以改进代码,在当排序时无序区没有发生改变,我们可以认为此时已经排序完成

时间复杂度:

        O(n²)

代码改进

  1. def bubble_sort(li):
  2. for i in range(len(li) - 1):
  3. exchange = False
  4. for j in range(len(li) - i - 1):
  5. if li[j] > li[j + 1]:
  6. li[j], li[j + 1] = li[j + 1], li[j]
  7. exchange = True
  8. print("第%s趟" % i, li)
  9. if exchange is False:
  10. return
  11. li = [9, 8, 7, 1, 2, 3, 4, 5, 6]
  12. print(li)
  13. bubble_sort(li)
  14. # 结果
  15. [9, 8, 7, 1, 2, 3, 4, 5, 6]
  16. 0趟 [8, 7, 1, 2, 3, 4, 5, 6, 9]
  17. 1趟 [7, 1, 2, 3, 4, 5, 6, 8, 9]
  18. 2趟 [1, 2, 3, 4, 5, 6, 7, 8, 9]
  19. 3趟 [1, 2, 3, 4, 5, 6, 7, 8, 9]

2、选择排序 

循环遍历列表list,每次遍历将当前遍历出来的元素ii后面的所有元素进行比较,取最小值min,然后将mini交换位置,遍历所有元素后,即达成排序效果

代码

  1. def select_sort(li):
  2. for i in range(len(li) - 1):
  3. min_loc = i # 将每次遍历出来的下标记录为最小位置
  4. for j in range(i + 1, len(li)): # 把上面记录的最小位置的值,与之后面所有的值进行比较,取最小值
  5. if li[j] < li[min_loc]:
  6. min_loc = j
  7. li[i], li[min_loc] = li[min_loc], li[i]
  8. print(li)
  9. li = [6, 3, 4, 5, 7, 2, 1, 9, 8]
  10. print(li)
  11. select_sort(li)
  12. print(li)
  13. # 结果
  14. [6, 3, 4, 5, 7, 2, 1, 9, 8]
  15. [1, 3, 4, 5, 7, 2, 6, 9, 8]
  16. [1, 2, 4, 5, 7, 3, 6, 9, 8]
  17. [1, 2, 3, 5, 7, 4, 6, 9, 8]
  18. [1, 2, 3, 4, 7, 5, 6, 9, 8]
  19. [1, 2, 3, 4, 5, 7, 6, 9, 8]
  20. [1, 2, 3, 4, 5, 6, 7, 9, 8]
  21. [1, 2, 3, 4, 5, 6, 7, 9, 8]
  22. [1, 2, 3, 4, 5, 6, 7, 8, 9]
  23. [1, 2, 3, 4, 5, 6, 7, 8, 9]

时间复杂度:

        O(n²)

3、插入排序

插入排序的工作方式像许多人排序一手扑克牌。开始时,我们的左手为空并且桌子上的牌面向下。然后,我们每次从桌子上拿走一张牌并将它插入左手中正确的位置。为了找到一张牌的正确位置,我们从右到左将它与已在手中的每张牌进行比较。拿在左手上的牌总是排序好的。

插入排序是指在待排序的元素中,假设前面n-1(其中n>=2)个数已经是排好顺序的,现将第n个数插到前面已经排好的序列中,然后找到合适自己的位置,使得插入第n个数的这个序列也是排好顺序的。按照此法对所有元素进行插入,直到整个序列排为有序的过程,称为插入排序

代码

  1. def insert_sort_two(li):
  2. for j in range(1, len(li)): # j 代表我手里摸到牌的下标
  3. tmp = li[j] # 当前摸到的牌
  4. k = j - 1 # k代表我手里现在最右边的牌(0,j-1)
  5. # 找到排序的位置插入当前摸到的牌(将手里的牌依次与摸到的牌进行比较,如果手里的牌大于摸到的牌,则手里的牌向后移一位)
  6. while k >= 0 and li[k] > tmp:
  7. li[k + 1] = li[k]
  8. k -= 1
  9. li[k + 1] = tmp
  10. li = [4, 2, 1, 3, 7, 5, 9, 8, 6]
  11. insert_sort(li)
  12. # 结果
  13. [2, 4, 1, 3, 7, 5, 9, 8, 6]
  14. [1, 2, 4, 3, 7, 5, 9, 8, 6]
  15. [1, 2, 3, 4, 7, 5, 9, 8, 6]
  16. [1, 2, 3, 4, 7, 5, 9, 8, 6]
  17. [1, 2, 3, 4, 5, 7, 9, 8, 6]
  18. [1, 2, 3, 4, 5, 7, 9, 8, 6]
  19. [1, 2, 3, 4, 5, 7, 8, 9, 6]
  20. [1, 2, 3, 4, 5, 6, 7, 8, 9]

时间复杂度:

        O(n²)

4、比较三个排序算法 

  1. import random
  2. import time
  3. def cal_time(func):
  4. def inner(*args, **kwargs):
  5. strat = time.time()
  6. result = func(*args, **kwargs)
  7. end = time.time()
  8. print('%s执行时间:%s' % (func.__name__, end - strat))
  9. return result
  10. return inner
  11. @cal_time
  12. def bubble_sort(li):
  13. for i in range(len(li) - 1):
  14. exchange = False
  15. for j in range(len(li) - i - 1):
  16. if li[j] > li[j + 1]:
  17. li[j], li[j + 1] = li[j + 1], li[j]
  18. exchange = True
  19. # print("第%s趟" % i, li)
  20. if exchange is False:
  21. return
  22. @cal_time
  23. def select_sort(li):
  24. for i in range(len(li) - 1):
  25. min_loc = i # 将每次遍历出来的下标记录为最小位置
  26. for j in range(i + 1, len(li)): # 把上面记录的最小位置的值,与之后面所有的值进行比较,取最小值
  27. if li[j] < li[min_loc]:
  28. min_loc = j
  29. li[i], li[min_loc] = li[min_loc], li[i]
  30. # print(li)
  31. @cal_time
  32. def insert_sort(li):
  33. for j in range(1, len(li)): # j 代表我手里摸到牌的下标
  34. tmp = li[j] # 当前摸到的牌
  35. k = j - 1 # k代表我手里现在最右边的牌(0,j-1)
  36. # 找到排序的位置插入当前摸到的牌(将手里的牌依次与摸到的牌进行比较,如果手里的牌大于摸到的牌,则手里的牌向后移一位)
  37. while k >= 0 and li[k] > tmp:
  38. li[k + 1] = li[k]
  39. k -= 1
  40. li[k + 1] = tmp
  41. # print(li)
  42. li = list(range(1, 10000))
  43. random.shuffle(li)
  44. bubble_sort(li)
  45. select_sort(li)
  46. insert_sort(li)

  1. bubble_sort执行时间:3.270739793777466
  2. select_sort执行时间:1.2142643928527832
  3. insert_sort执行时间:0.0

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/2023面试高手/article/detail/407408
推荐阅读
相关标签
  

闽ICP备14008679号