• Python算法:八大排序算法以及速度比较


    ⭐️⭐️⭐️⭐️⭐️欢迎来到我的博客⭐️⭐️⭐️⭐️⭐️
    🐴作者:秋无之地

    🐴简介:CSDN爬虫、后端、大数据领域创作者。目前从事python爬虫、后端和大数据等相关工作,主要擅长领域有:爬虫、后端、大数据开发、数据分析等。

    🐴欢迎小伙伴们点赞👍🏻、收藏⭐️、留言💬、关注🤝,关注必回关

    一、确定目标

    这次的目标是:使用Python编写八大排序算法,并且比较一下各种排序算法在真实场景下的运行速度。

    二、算法比较

    1、直接插入排序

    • 时间复杂度:O(n²)
    • 空间复杂度:O(1)
    • 稳定性:稳定

    1. def insert_sort(array):
    2. for i in range(len(array)):
    3. for j in range(i):
    4. if array[i] < array[j]:
    5. array.insert(j, array.pop(i))
    6. break
    7. return array

     2、希尔排序

    • 时间复杂度:O(n)
    • 空间复杂度:O(n√n)
    • 稳定性:不稳定
    1. def shell_sort(array):
    2. gap = len(array)
    3. while gap > 1:
    4. gap = gap // 2
    5. for i in range(gap, len(array)):
    6. for j in range(i % gap, i, gap):
    7. if array[i] < array[j]:
    8. array[i], array[j] = array[j], array[i]
    9. return array

      3、简单选择排序

    • 时间复杂度:O(n²)
    • 空间复杂度:O(1)
    • 稳定性:不稳定
    1. def select_sort(array):
    2. for i in range(len(array)):
    3. x = i # min index
    4. for j in range(i, len(array)):
    5. if array[j] < array[x]:
    6. x = j
    7. array[i], array[x] = array[x], array[i]
    8. return array

      4、堆排序

    • 时间复杂度:O(nlog₂n)
    • 空间复杂度:O(1)
    • 稳定性:不稳定
    1. def heap_sort(array):
    2. def heap_adjust(parent):
    3. child = 2 * parent + 1 # left child
    4. while child < len(heap):
    5. if child + 1 < len(heap):
    6. if heap[child + 1] > heap[child]:
    7. child += 1 # right child
    8. if heap[parent] >= heap[child]:
    9. break
    10. heap[parent], heap[child] = \
    11. heap[child], heap[parent]
    12. parent, child = child, 2 * child + 1
    13. heap, array = array.copy(), []
    14. for i in range(len(heap) // 2, -1, -1):
    15. heap_adjust(i)
    16. while len(heap) != 0:
    17. heap[0], heap[-1] = heap[-1], heap[0]
    18. array.insert(0, heap.pop())
    19. heap_adjust(0)
    20. return array

    5、冒泡排序

    • 时间复杂度:O(n²)
    • 空间复杂度:O(1)
    • 稳定性:稳定
    1. def bubble_sort(array):
    2. for i in range(len(array)):
    3. for j in range(i, len(array)):
    4. if array[i] > array[j]:
    5. array[i], array[j] = array[j], array[i]
    6. return array

     6、快速排序

    • 时间复杂度:O(nlog₂n)
    • 空间复杂度:O(nlog₂n)
    • 稳定性:不稳定
    1. def quick_sort(array):
    2. def recursive(begin, end):
    3. if begin > end:
    4. return
    5. l, r = begin, end
    6. pivot = array[l]
    7. while l < r:
    8. while l < r and array[r] > pivot:
    9. r -= 1
    10. while l < r and array[l] <= pivot:
    11. l += 1
    12. array[l], array[r] = array[r], array[l]
    13. array[l], array[begin] = pivot, array[l]
    14. recursive(begin, l - 1)
    15. recursive(r + 1, end)
    16. recursive(0, len(array) - 1)
    17. return array

      7、归并排序

    • 时间复杂度:O(nlog₂n)
    • 空间复杂度:O(1)
    • 稳定性:稳定
    1. def merge_sort(array):
    2. def merge_arr(arr_l, arr_r):
    3. array = []
    4. while len(arr_l) and len(arr_r):
    5. if arr_l[0] <= arr_r[0]:
    6. array.append(arr_l.pop(0))
    7. elif arr_l[0] > arr_r[0]:
    8. array.append(arr_r.pop(0))
    9. if len(arr_l) != 0:
    10. array += arr_l
    11. elif len(arr_r) != 0:
    12. array += arr_r
    13. return array
    14. def recursive(array):
    15. if len(array) == 1:
    16. return array
    17. mid = len(array) // 2
    18. arr_l = recursive(array[:mid])
    19. arr_r = recursive(array[mid:])
    20. return merge_arr(arr_l, arr_r)
    21. return recursive(array)

    8、基数排序

    • 时间复杂度:O(d(r+n))
    • 空间复杂度:O(rd+n)
    • 稳定性:稳定
    1. def radix_sort(array):
    2. bucket, digit = [[]], 0
    3. while len(bucket[0]) != len(array):
    4. bucket = [[], [], [], [], [], [], [], [], [], []]
    5. for i in range(len(array)):
    6. num = (array[i] // 10 ** digit) % 10
    7. bucket[num].append(array[i])
    8. array.clear()
    9. for i in range(len(bucket)):
    10. array += bucket[i]
    11. digit += 1
    12. return array

    三、速度比较

    如果数据量特别大,采用分治算法的快速排序和归并排序,可能会出现递归层次超出限制的错误。

    1、算法执行时间

    2、算法速度比较

    四、总结

    1. 从速度来看,快速排序的耗时最短;
    2. 从稳定性来看,直接插入、冒泡、归并、基数等排序相对稳定;
    3. 从代码复杂度来看,冒泡排序最简单。

    版权声明

    本文章版权归作者所有,未经作者允许禁止任何转载、采集,作者保留一切追究的权利。

  • 相关阅读:
    【问题解决】新版webots纹理等资源文件加载/下载时间过长
    问题解决:Docker:IPv4 forwarding is disabled
    如何理解分布式架构和微服务架构呢
    4种经典的限流算法与集群限流
    RabbitMQ 5种工作模式介绍和Springboot具体实现
    车载网络测试工程师们可以了解下呀
    《人类简史》笔记一——快乐该如何计算
    设计模式之六大设计原则
    【GNN】采样算法总结
    RT-Thread——概述与体验
  • 原文地址:https://blog.csdn.net/weixin_42108731/article/details/133955726