• Python的常用排序算法实现


    一、引言

            所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作。排序算法,就是如何使得记录按照要求排列的方法。排序算法在很多领域得到相当地重视,尤其是在大量数据的处理方面。一个优秀的算法可以节省大量的资源。在各个领域中考虑到数据的各种限制和规范,要得到一个符合实际的优秀算法,得经过大量的推理和分析。——百度百科

            常见的排序算法(8种)有:插入排序、希尔排序、选择排序、冒泡排序、归并排序、快速排序、堆排序、基数排序等。

            由于最近经常用到排序算法,这里给出5中更常用的排序算法(选择排序、插入排序、冒泡排序、快速排序和归并排序)的实现方式,以防不便之需。这样,再次遇到排序问题的时候,我可以通过直接复习自己的代码来解决自己所遇到的问题,而不至于看网上代码、改来改去。毕竟,自己写出来的代码,自己理解起来更快。

            下列代码(没啥注释,想理解排序算法的不建议看)全部按照升序的方式进行排序。

    二、选择排序

            选择排序最好、最坏、平均时间复杂度均为O(n^2),空间复杂度为O(1)。

            代码

    1. def insert_sort(data_list):
    2. for i in range(len(data_list)):
    3. j = i
    4. while j > 0:
    5. if data_list[j] < data_list[j-1]: // 交换,例如10 5 -> 5 10
    6. temp, data_list[j] = data_list[j], data_list[j-1]
    7. data_list[j-1] = temp
    8. else:
    9. break
    10. j -= 1
    11. data = [45, 123, 89, 1, -15]
    12. insert_sort(data)
    13. print(data)

            测试程序输出

    [-15, 1, 45, 89, 123]

    三、插入排序

            插入排序最好时间复杂度为O(n),最坏时间复杂度为O(n^2),平均时间复杂度为O(n^2),空间复杂度为O(1)。

            代码

    1. def select_sort(data_list):
    2. for i in range(len(data_list) - 1):
    3. min_index = i # 记录最小数的索引
    4. for j in range(i+1, len(data_list)):
    5. if data_list[j] < data_list[min_index]:
    6. min_index = j
    7. if i != min_index: # i不是最小数时,将i和最小数进行交换
    8. data_list[i], data_list[min_index] = data_list[min_index], data_list[i]
    9. data = [45, 123, 89, 1, -15]
    10. select_sort(data)
    11. print(data)

            测试程序输出

    [-15, 1, 45, 89, 123]

    四、冒泡排序

            冒泡排序最好时间复杂度为O(n),最坏时间复杂度为O(n^2),平均时间复杂度为O(n^2),空间复杂度为O(1)。

            代码

    1. def bubble_sort(data_list):
    2. for i in range(1, len(data_list)):
    3. for j in range(0, len(data_list)-i):
    4. if data_list[j] > data_list[j+1]:
    5. data_list[j], data_list[j + 1] = data_list[j + 1], data_list[j]
    6. data = [45, 123, 89, 1, -15]
    7. bubble_sort(data)
    8. print(data)

            测试程序输出

    [-15, 1, 45, 89, 123]

    五、快速排序

            快速排序最好时间复杂度为O(nlogn),最坏时间复杂度为O(n^2),平均时间复杂度为O(nlogn),最好空间复杂度为O(logn),最坏空间复杂度为O(n),平均空间复杂度为O(logn)。

            代码

    1. def quick_sort(data_list, left=None, right=None):
    2. left = 0 if not isinstance(left, (int, float)) else left
    3. right = len(data_list) - 1 if not isinstance(right, (int, float)) else right
    4. if left < right:
    5. partitionIndex = partition(data_list, left, right)
    6. quick_sort(data_list, left, partitionIndex - 1)
    7. quick_sort(data_list, partitionIndex + 1, right)
    8. def partition(data_list, left, right):
    9. pivot = left
    10. index = pivot + 1
    11. i = index
    12. while i <= right:
    13. if data_list[i] < data_list[pivot]:
    14. swap(data_list, i, index)
    15. index += 1
    16. i += 1
    17. swap(data_list, pivot, index - 1)
    18. return index - 1
    19. def swap(data_list, i, j):
    20. data_list[i], data_list[j] = data_list[j], data_list[i]
    21. data = [45, 123, 89, 1, -15]
    22. quick_sort(data)
    23. print(data)

            测试程序输出

    [-15, 1, 45, 89, 123]

    六、归并排序

            归并排序的最好、最坏、平均时间复杂度均为O(nlogn),空间复杂度为O(n)。

            代码

    1. import math
    2. def merge_sort(data_list):
    3. if len(data_list) < 2:
    4. return data_list
    5. middle = math.floor(len(data_list) / 2)
    6. left, right = data_list[0:middle], data_list[middle:]
    7. return merge(merge_sort(left), merge_sort(right))
    8. def merge(left, right):
    9. result = []
    10. while left and right:
    11. if left[0] <= right[0]:
    12. result.append(left.pop(0))
    13. else:
    14. result.append(right.pop(0))
    15. while left:
    16. result.append(left.pop(0))
    17. while right:
    18. result.append(right.pop(0))
    19. return result
    20. data = [45, 123, 89, 1, -15]
    21. data = merge_sort(data)
    22. print(data)

            测试程序输出

    [-15, 1, 45, 89, 123]

    七、Python内置排序方法

            Python内置的排序方法是Timsort,其最好时间复杂度为O(n),最坏、平均时间复杂度为O(nlogn),空间复杂度为O(n)。

            第一种使用方式如下

    1. data = [45, 123, 89, 1, -15]
    2. data = sorted(data, reverse=False)
    3. print(data)

            上述程序输出为

    [-15, 1, 45, 89, 123]

            第二种使用方式如下

    1. data = [45, 123, 89, 1, -15]
    2. data.sort(reverse=False)
    3. print(data)

            上述程序输出为

    [-15, 1, 45, 89, 123]

    八、参考

            1. 百度百科

            2. 菜鸟教程

            3. Python内置算法

  • 相关阅读:
    ABAP(ALV部分)
    Java并发编程之可见性分析 volatile
    Leetcode 224. 基本计算器
    【Vue】Vue的监听属性与计算属性
    基于51单片机的环境温湿度光强监测系统proteus仿真原理图PCB
    PCIE AER Linux 驱动详解
    FreeSWITCH在session上执行特定dialplan
    java.sql.SQLSyntaxErrorException: Unknown database ‘数据库名‘
    面向大型语言模型的低功耗加速–高通云人工智能软件开发工具包
    【WhatsApp营销】如何为企业构建WhatsApp聊天机器人
  • 原文地址:https://blog.csdn.net/qq_36158230/article/details/126843379