• 冒泡排序、选择排序、插入排序、希尔排序


    冒泡排序

    基本思想

    代码实现

    1. # 冒泡排序
    2. def bubble_sort(arr):
    3. length = len(arr) - 1
    4. for i in range(length):
    5. flag = True
    6. for j in range(length - i):
    7. if arr[j] > arr[j + 1]:
    8. temp = arr[j]
    9. arr[j] = arr[j + 1]
    10. arr[j + 1] = temp
    11. flag = False
    12. print(f'第{i + 1}趟的排序结果为:', arr)
    13. if flag:
    14. # 代码优化,如果某一趟排序中没有发生交换,表示序列已经有序,可以提前结束循环
    15. break
    16. bubble_sort([3, 9, -1, 10, 20])
    17. bubble_sort([3, 9, -1, 10, -2])

    选择排序

    基本思想

     

    代码实现

    1. # 选择排序
    2. def select_sort(arr):
    3. for i in range(len(arr) - 1): # 进行 n-1 趟排序
    4. min = arr[i]
    5. index = i
    6. for j in range(i + 1, len(arr)):
    7. if min > arr[j]:
    8. min = arr[j]
    9. index = j
    10. if index != i:
    11. arr[index] = arr[i]
    12. arr[i] = min
    13. print(f'第{i + 1}趟排序结果:', arr)
    14. select_sort([3, 9, -1, 10, -2])
    15. select_sort([3, 9, -1, 10, 20])

    插入排序

    基本思想

    代码实现

    1. # 插入排序
    2. def insert_sort(arr):
    3. # for 循环遍历的是待排序的序列,即无序的序列
    4. for i in range(len(arr) - 1):
    5. insert_val = arr[i + 1] # 待插入有序列表的值
    6. # 以 insert_index 位置为分割点,可以把 insert_index 及其之前的元素理解为已排序的序列
    7. # insert_index 以后的元素是无序序列
    8. insert_index = i # 待插入值的前一个值的下标,即有序列表的最后一个元素的位置
    9. # while 循环遍历的是已有序的序列
    10. # insert_index >= 0 保证下标不越界
    11. # 从后往前访问有序列表
    12. # insert_val < arr[insert_index] 当待插入的值比有序列表中的值还小时,往前遍历有序列表,继续比较
    13. while insert_index >= 0 and insert_val < arr[insert_index]:
    14. # 将 arr[insert_index] 值后移,空出前面的位置存放待插入的值
    15. arr[insert_index + 1] = arr[insert_index]
    16. # 继续访问有序列表的前一个元素
    17. insert_index -= 1
    18. # 退出循环时,表示找到了插入的位置
    19. # 插入的位置为 insert_index + 1 ,因为 insert_index 位置要么为 -1 ,要么为比待插入值小的数
    20. arr[insert_index + 1] = insert_val
    21. print(f'第{i + 1}个待插入的值插入后的结果', arr)
    22. insert_sort([3, 9, -1, 10, -2])
    23. insert_sort([3, 9, -1, 10, 20])
    24. # 同样的思想,稍微不同的写法
    25. def insert_sort1(arr):
    26. # arr = [6, 5, 3, 1, 8, 7, 2, 4]
    27. for i in range(1, len(arr)):
    28. t = arr[i]
    29. while t < arr[i - 1] and i >= 1:
    30. arr[i] = arr[i - 1]
    31. i -= 1
    32. arr[i] = t
    33. arr = [6, 5, 3, 1, 8, 7, 2, 4]
    34. insert_sort1(arr)
    35. print(arr)

    希尔排序

    基本思想

     

    代码实现

    1. # 希尔排序——交换法(效率低)
    2. def shell_sort1(arr):
    3. """
    4. # 以 [8, 9, 1, 7, 2, 3, 5, 4, 6, 0] 为例进行分析
    5. # 希尔排序的第一轮
    6. # 第一轮将数组分为 10 // 2 = 5 组
    7. for i in range(5, len(arr)):
    8. # 遍历各组中所有的元素(共5组,每组2个元素),步长为5
    9. j = i - 5
    10. while j >= 0:
    11. # 如果当前元素大于加上步长后的哪个元素,说明需要交换
    12. if arr[j] > arr[j + 5]:
    13. temp = arr[j]
    14. arr[j] = arr[j + 5]
    15. arr[j + 5] = temp
    16. j -= 5
    17. print('希尔排序的第一轮结果:', arr)
    18. # 希尔排序的第二轮 [3, 5, 1, 6, 0, 8, 9, 4, 7, 2]
    19. # 第二轮将数组分为 5 // 2 = 2 组
    20. for i in range(2, len(arr)):
    21. # 遍历各组中所有的元素(共2组,每组5个元素),步长为5
    22. j = i - 2
    23. while j >= 0:
    24. # 如果当前元素大于加上步长后的哪个元素,说明需要交换
    25. if arr[j] > arr[j + 2]:
    26. temp = arr[j]
    27. arr[j] = arr[j + 2]
    28. arr[j + 2] = temp
    29. j -= 2
    30. print('希尔排序的第二轮结果:', arr)
    31. # 希尔排序的第三轮 [0, 2, 1, 4, 3, 5, 7, 6, 9, 8]
    32. # 第三轮将数组分为 2 // 2 = 1 组
    33. for i in range(1, len(arr)):
    34. # 遍历各组中所有的元素(共1组,每组10个元素),步长为5
    35. j = i - 1
    36. while j >= 0:
    37. # 如果当前元素大于加上步长后的哪个元素,说明需要交换
    38. if arr[j] > arr[j + 1]:
    39. temp = arr[j]
    40. arr[j] = arr[j + 1]
    41. arr[j + 1] = temp
    42. j -= 1
    43. print('希尔排序的第三轮结果:', arr)
    44. """
    45. # 交换法希尔排序
    46. gap = len(arr) // 2
    47. while gap > 0:
    48. for i in range(gap, len(arr)):
    49. # 遍历各组中所有的元素,步长为gap
    50. j = i - gap
    51. while j >= 0:
    52. # 如果当前元素大于加上步长后的哪个元素,说明需要交换
    53. if arr[j] > arr[j + gap]:
    54. temp = arr[j]
    55. arr[j] = arr[j + gap]
    56. arr[j + gap] = temp
    57. j -= gap
    58. print('本轮排序结果:', arr)
    59. gap //= 2
    60. # 希尔排序——移位法(效率更高)
    61. def shell_sort2(arr):
    62. # 移位法希尔排序,效率更高
    63. gap = len(arr) // 2
    64. while gap > 0:
    65. for i in range(gap, len(arr)):
    66. j = i
    67. temp = arr[j]
    68. if arr[j] < arr[j - gap]:
    69. while j - gap >= 0 and temp < arr[j - gap]:
    70. arr[j] = arr[j - gap]
    71. j -= gap
    72. arr[j] = temp
    73. print('本轮排序结果:', arr)
    74. gap //= 2
    75. shell_sort1([8, 9, 1, 7, 2, 3, 5, 4, 6, 0])
    76. shell_sort2([8, 9, 1, 7, 2, 3, 5, 4, 6, 0])

  • 相关阅读:
    59. 螺旋矩阵 II
    ES 数据迁移最佳实践
    网工内推 | H3C售前工程师,上市公司,13薪,有带薪年假、年终奖
    Effective Java学习笔记---------通用编程
    mysql存储过程和函数
    h5实现地图定位签到
    如何画产品架构图?
    【2. MVCC-多版本并发控制技术】
    MYSQL不常用但好用写法
    Spring5之IOC容器中IOC操作之Bean管理(二)之p名称空间注入、外部bean、内部bean、级联赋值
  • 原文地址:https://blog.csdn.net/2301_77659011/article/details/132814767