• Python排序:冒泡,选择,插入,希尔,归并,快速


    编程中的交换元素逻辑:

     

    1. # python中交换元素 有内置的三方底层逻辑 可以直接交换
    2. a = 2
    3. b = 3
    4. a, b = b, a
    5. print(a) # a为3
    6. # 其他编程需要有一个中间的变量来转换 变量设为temp
    7. a = 2
    8. b = 3
    9. temp = a
    10. a = b
    11. b = temp
    12. print(a) # a为3

    -----冒泡排序-----

    相邻元素,比较大小,如果顺序不符合规则,则交换位置。 

    排好序的放后面,依次递减,直到第一位

    1. -----冒泡排序-----
    2. list1 = [3, 6, 8, 1, 5, 4, 2]
    3. print('list1原列表', list1)
    4. for i in range(len(list1) - 1):
    5. for j in range(len(list1) - i - 1):
    6. if list1[j] > list1[j + 1]: # 说明不符合(小--大)顺序,需要交换元素
    7. list1[j], list1[j + 1] = list1[j + 1], list1[j]
    8. print('list1排序后', list1)

    -----选择排序----- 

    在未排序的序列中,找到最小元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中,继续寻找最小元素,放到已经排序序列的末尾。以此类推,直到所有元素均排序完毕。

    1. -----选择排序-----
    2. list2 = [3, 6, 8, 2, 5, 4, 1]
    3. print('list2原列表', list2)
    4. for i in range(len(list2) - 1):
    5. min_index = i
    6. for j in range(i + 1, len(list2)):
    7. if list2[min_index] > list2[j]:
    8. min_index = j
    9. list2[min_index], list2[i] = list2[i], list2[min_index]
    10. print('list2排序后', list2)

    -----插入排序-----

    构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。

    实现逻辑

    ① 从第一个元素开始,该元素可以认为已经被排序

    ② 取出下一个元素,在已经排序的元素序列中从后向前扫描

    ③如果该元素(已排序)大于新元素,将该元素移到下一位置

    ④ 重复步骤③,直到找到已排序的元素小于或者等于新元素的位置

    ⑤将新元素插入到该位置后

    ⑥ 重复步骤②~⑤

    1. -----插入排序-----
    2. def insertion_sort(arr):
    3. # 第一层for表示循环插入的遍数
    4. for i in range(1, len(arr)):
    5. # 当前需要插入的元素
    6. current = arr[i]
    7. # 相邻前面元素下标
    8. pre_index = i - 1
    9. # 索引>=0 当前要插入元素<前面元素
    10. while pre_index >= 0 and current < arr[pre_index]:
    11. # 前面元素索引往后移
    12. arr[pre_index + 1] = arr[pre_index]
    13. # pre_index赋值下一位前面元素的下标
    14. pre_index -= 1
    15. # 重新定义当前元素下标 为前面元素下标+1
    16. arr[pre_index + 1] = current
    17. return arr
    18. list3 = [6, 3, 8, 2, 5, 4, 1]
    19. B = insertion_sort(list3)
    20. print(B)

    -----希尔排序-----

    排序的思想:将序列,分割为若干个子序列,每个序列做插入排序当整个序列基本有序,对整体做一次插入排序 

    1. -----希尔排序-----缩小增量排序
    2. def shell_sort(arr):
    3. # 取整计算增量(间隔)值
    4. gap = len(arr) // 2
    5. while gap > 0:
    6. # 从增量值开始遍历比较
    7. for i in range(gap, len(arr)):
    8. j = i
    9. current = arr[i] # 当前需要插入的元素
    10. # 索引>=0 当前元素<前面元素
    11. # arr[j - gap] 遍历前面元素的下标 - 增量值 = 对应前面元素的下标
    12. while j - gap >= 0 and current < arr[j - gap]:
    13. # 前面元素索引往后移
    14. arr[j] = arr[j - gap]
    15. # 赋值下一位前面元素的下标
    16. j -= gap
    17. # 重新定义当前元素下标 为前面元素下标+1
    18. arr[j] = current
    19. # 缩小增量(间隔)值
    20. gap //= 2
    21. return arr
    22. list4 = [3, 6, 3, 18, 72, 55, 34, 1, 15, 18, 12, 11, 25]
    23. sorted_arr = shell_sort(list4)
    24. print(sorted_arr)

    -----归并排序-----

    归并排序采用分治法,思想是:先递归拆分数组为两半,再合并数组。

    1、拆分数组

    假设数组一共有 n 个元素,我们递归对数组进行折半拆分即n//2,直到每组只有一个元素为止。

    2、合并数组

    算法会从最小数组开始有序合并,这样合并出来的数组一直是有序的,所以合并两个有序数组是归并算法的核心

    1. -----归并排序-----
    2. def merge_sort(lst):
    3. # 递归结束条件
    4. if len(lst) <= 1:
    5. return lst
    6. # 分解问题,并递归调用
    7. middle = len(lst) // 2
    8. left = merge_sort(lst[:middle])
    9. right = merge_sort(lst[middle:])
    10. # 合并左右半部分,完成排序
    11. merged_lst = []
    12. # 在两个列表都有元素的情况下
    13. while left and right:
    14. # 比较左右第一个元素
    15. if left[0] <= right[0]:
    16. # 左边小 利用pop(0) 弹出第一个元素 进行添加
    17. merged_lst.append(left.pop(0))
    18. else:
    19. # 右边列表第一个元素小 添加右边
    20. merged_lst.append(right.pop(0))
    21. # 如果左部分或右部分还有剩余,那就拼接到排好序的列表中
    22. merged_lst.extend(right if right else left)
    23. return merged_lst
    24. A = [11, 15, 88, 56, 13, 20, 44, 65, 28, 77, 40, 59, 83, 5, 80]
    25. B = merge_sort(A)
    26. print('待排序:', A)
    27. print('已排序:', B)

    -----快速排序-----

    快速排序的基本原理是:

    1. 先从数列中取出一个数作为基准数。(可以是第一个、最后一个、中间的或者干脆随机的)

    2. 分区过程,将比这个数大的数全放到它的右边,小于的数全放到它的左边。

    3. 再对左右区间重复第二步,直到各区间只有一个数。

    1. -----快速排序-----
    2. import random
    3. class SortUtil():
    4. def quickSort(self, arr):
    5. if not arr:
    6. return arr
    7. pivot = random.choice(arr)
    8. equalList = []
    9. smallerList = [] # 存放小值
    10. biggerList = [] # 存放大值
    11. for item in arr:
    12. if item < pivot:
    13. smallerList.append(item)
    14. elif item == pivot:
    15. equalList.append(item)
    16. else:
    17. biggerList.append(item)
    18. # 每次返回小的或大的列表过去 进行下次分类排序
    19. return self.quickSort(smallerList) + equalList + self.quickSort(biggerList)
    20. # 待排序列表
    21. A = [3, 5, 59, 59, 25, 18, 46, 84, 15, 20, 33, 68]
    22. KS = SortUtil()
    23. sort_new = KS.quickSort(A)
    24. print(sort_new)

  • 相关阅读:
    物联网AI MicroPython学习之语法 sys系统相关
    Python在不同场景下的并发编程方案选择
    软件开发项目文档系列之三如何撰写项目招标文件
    HTML概述_入门篇
    String长度限制?
    新手开抖店之前,这三个核心点,一定要提前了解!
    基于springboot垃圾分类管理系统
    Milvus向量数据库:高效处理海量非结构化数据的利器
    Android录制音频并使用ijkplayer播放
    Redis一主一从Docker方式部署通过keepalived和 sentinel哨兵模式实现高可用
  • 原文地址:https://blog.csdn.net/Ben_boba/article/details/128043082