小工具知识网

当前位置: 首页 > 行业知识 > 排序算法总结(基于Python)

行业知识

排序算法总结(基于Python)

2026-10-21 16:06:43 来源:互联网转载

排序算法总结(基于Python)

文章目录

  • 排序算法总结(基于Python)
    • 比较排序
      • 冒泡排序
      • 梳排序
      • 堆排序
      • 归并排序
      • 快速排序
      • 内省排序
      • Timesort
      • 非比较排序
        • 桶排序
        • 基���排序

          比较排序

          (基于比较的排序)给定一个包含 n n n个对象的待排序序列 a 1 , a 2 , . . . , a n {a_1},{a_2},...,{a_n} a1​,a2​,...,an​。假如已知如何比较任意两个对象的大小关系,以及如何对这一序列排序。对于自定义对象,比较规则应当满足两个性质:传递性和全序性。

          冒泡排序

          冒泡排序(Bubble Sort)也是一种简单直观的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端。

          ()

          特点:调整相邻两个对象的位置,每进行一次内循环,将最大值调整到最后。

          时间复杂度: O ( n 2 ) {\rm{O}}\left( {{{\rm{n}}^2}} \right) O(n2)

          def bubble_sort(arr):    n = len(arr)    # 遍历所有数组元素    for i in range(n):        for j in range(0, n - i - 1):            # 比较大小            if arr[j] > arr[j + 1]:                arr[j], arr[j + 1] = arr[j + 1], arr[j]

          梳排序

          梳排序是改良自冒泡排序,其要旨在于消除乌龟,亦即在阵列尾部的小数值,这些数值是造成冒泡排序缓慢的主因。相对地,兔子,亦即在阵列前端的大数值,不影响冒泡排序的效能。

          ()

          冒泡排序总是比较相邻的值。所以一次交换中只能删除一个逆序计数。而梳式排序通过使用大于1的间隔来改进冒泡排序。间隔从一个较大的值开始,并在每次迭代中缩小1.3倍,直到达到值1。因此,梳式排序在一次交换中删除了多个逆序计数,比冒泡排序性能上更好。

          收缩系数的设定影响着梳排序的效率。根据经验,收缩系数是1.3 (通过在超过20万个随机列表上测试梳排序)。

          虽然平均情况下,它比冒泡排序性能更好,但在最坏的情况下仍然是 O ( n 2 ) {\rm{O}}\left( {{{\rm{n}}^2}} \right) O(n2)。

          def comb_sort(arr):    the_len = len(arr)    if the_len = 1:            for j in range(the_len):                if i + j >= the_len:                    i = int(i / 1.3)                    break                else:                    if arr[j] >= arr[j + i]:                        arr[j], arr[j + i] = arr[j + i], arr[j]        return arr

          堆排序

          堆排序(Heap Sort)是利用堆这种数据结构所设计的一种排序算法。堆的结构是一棵完全二叉树的结构,并且满足堆积的性质:每个节点(叶节点除外)的值都大于等于(或都小于等于)它的子节点。

          堆排序先按从上到下、从左到右的顺序将待排序列表中的元素构造成一棵完全二叉树,然后对完全二叉树进行调整,使其满足堆积的性质:每个节点(叶节点除外)的值都大于等于(或都小于等于)它的子节点。构建出堆后,将堆顶与堆尾进行交换,然后将堆尾从堆中取出来,取出来的数据就是最大(或最小)的数据。重复构建堆并将堆顶和堆尾进行交换,取出堆尾的数据,直到堆中的数据全部被取出,列表排序完成。总的时间复杂度: O ( n + k log ⁡ n ) {\rm{O}}\left( {n + k\log n} \right) O(n+klogn)

          堆结构分为大顶堆和小顶堆:

          • 大顶堆:每个节点(叶节点除外)的值都大于等于其子节点的值,根节点的值是所有节点中最大的,所以叫大顶堆,在堆排序算法中用于升序排列。

            -小顶堆:每个节点(叶节点除外)的值都小于等于其子节点的值,根节点的值是所有节点中最小的,所以叫小顶堆,在堆排序算法中用于降序排列。

            堆排序的原理如下:

            1. 将待排序列表中的数据按从上到下、从左到右的顺序构造成一棵完全二叉树。
            2. 将完全二叉树中每个节点(叶节点除外)的值与其子节点(子节点有一个或两个)中较大的值进行比较,如果节点的值小于子节点的值,则交换他们的位置(大顶堆,小顶堆反之)。
            3. 将节点与子节点进行交换后,要继续比较子节点与孙节点的值,直到不需要交换或子节点是叶节点时停止。比较完所有的非叶节点后,即可构建出堆结构。
            4. 将数据构造成堆结构后,将堆顶与堆尾交换,然后将堆尾从堆中取出来,添加到已排序序列中,完成一轮堆排序,堆中的数据个数减1。
            5. 重复步骤2,3,4,直到堆中的数据全部被取出,列表排序完成。
            def heap_sort(array):    first = len(array) // 2 - 1    for start in range(first, -1, -1):        # 从下到上,从右到左对每个非叶节点进行调整,循环构建成大顶堆        big_heap(array, start, len(array) - 1)    for end in range(len(array) - 1, 0, -1):        # 交换堆顶和堆尾的数据        array[0], array[end] = array[end], array[0]        # 重新调整完全二叉树,构造成大顶堆        big_heap(array, 0, end - 1)    return arraydef big_heap(array, start, end):    root = start    # 左孩子的索引    child = root * 2 + 1    while child 

上一篇:服务器保护怎么关闭?

下一篇:主机一直开关