经典排序算法(Python 实现)

PostgreSQL性能优化:如何搭建监控体系? 本文系统讲解如何构建企业级PostgreSQL监控体系,覆盖四大核心维度:基础设施层、数据库实例层、会话与查询层、对象与存储层。通过Prometheus+Grafana+ELK等工具链实现指标采集、可视化与告警闭环管理,详细解析关键监控指标、部署方法及告警策略设计,帮助DBA快速定位慢查询、连接泄漏、存储膨胀等典型故障,构建"看得见、管得住、防得早"的数据库运维能力。 阅读详情

简介

有时,我们在应用程序中存储或检索的数据有可能是乱序的。如果想要正确处理或者有效使用数据,我们可能需要对数据重新排序。多年来,计算机科学家创造了许多排序算法来处理数据。

在本文中,我们将了解一些流行的排序算法,了解它们是如何工作的,并用 Python 来实现它们。们还将会比较它们对列表中的元素排序的速度。

为了简单起见,这些算法将对列表中的数字都进行升序排序。当然,你可以根据自己的需要来自由调整。

冒泡排序

这个简单的排序算法会通过迭代列表成对的比较列表中的元素,并且交换它们,直到较大的元素“冒泡”到列表的末尾,较小的元素保持在“底部”。

介绍

我们首先比较列表的前两个元素。如果第一个元素大于第二个元素,我们交换它们。如果它们已经排好序,我们将它们保持原样。然后我们移动到下一对元素,比较它们的值,并根据需要交换。这个过程将持续到列表中的最后一对元素。

当到达列表的末尾时,它会对每对元素重复此过程。但是,这个过程是很低效的。如果我们只需要在数组里面进行一次交换怎么办?为什么我们仍然会迭代n^2 次,即使数组已经排好序了?
显然,为了优化算法,我们需要在完成排序时停止它。

那我们怎么知道已经完成了排序?如果元素是有序的,那我们就不必继续交换。因此,每当交换值时,我们会将一个标志值设置为 True以重复排序过程。如果没有发生交换,标志值将保持为False,算法将停止。

实现

优化之后,我们可以通过以下的 Python 代码来实现冒泡排序:

def bubble_sort(nums):
    # 我们将标志值 swapped 设为 True,以便循环能够执行至少一次
    swapped = True
    while swapped:
        swapped = False
        for i in range(len(nums) - 1):
            if nums[i] > nums[i + 1]:
                # 交换元素
                nums[i], nums[i + 1] = nums[i + 1], nums[i]
                # 把标志值设为 True 以便我们能再次循环
                swapped = True

# 检查是否能够正确执行
random_list_of_nums = [5, 2, 1, 8, 4]
bubble_sort(random_list_of_nums)
print(random_list_of_nums)

这个算法在一个 while 循环里面运行,仅当没有元素能够交换时才会跳出循环。我们在开始时将 swapped 设为 True,以确保算法至少可以执行一次。

时间复杂度

在最坏的情况下(当列表处于相反的顺序时),该算法必须交换数组的每个项。每次迭代的时候,标志值 swapped 都会被设置为 True。因此,如果我们在列表中有 n 个元素,我们将对每个元素迭代 n 次,因此冒泡排序的时间复杂度为 O(n^2)。

选择排序

该算法将列表分为两部分:已排序部分和未排序部分。我们不断地删除列表中未排序部分的最小元素,并将其添加到已排序部分中。

介绍

实际上,我们并不需要为已排序的元素创建一个新的列表,我们要做的是将列表最左边的部分作为已排序部分。然后我们搜索整个列表中最小的元素,并将其与第一个元素交换。
现在我们知道列表的第一个元素是有序的,我们将继续搜索剩余元素中最小的元素,并将其与第二个元素交换。这将迭代到待检查元素是剩余列表的最后一项时。

实现

def selection_sort(nums):
    # i 的值对应于已排序值的数量
    for i in range(len(nums)):
        # 我们假设未排序部分的第一项是最小的
        lowest_value_index = i
        # 这个循环用来迭代未排序的项
        for j in range(i + 1, len(nums)):
            if nums[j] < nums[lowest_value_index]:
                lowest_value_index = j
        # 将未排序元素的最小的值与第一个未排序的元素的值相交换
        nums[i], nums[lowest_value_index] = nums[lowest_value_index], nums[i]

# 检验算法是否正确
random_list_of_nums = [12, 8, 3, 20, 11]
selection_sort(random_list_of_nums)
print(random_list_of_nums)

可以看到随着 i的增加,我们需要检查的元素越来越少。

时间复杂度

在选择排序算法中,我们可以通过检查 for 循环次数来轻松得到时间复杂度。对于一个有 n 个元素的列表,外层循环会迭代 n 次。当 i 的值为 1 时,内层循环会迭代 n-1 次,i 值为 2 时迭代 n-2 次然后依此类推。

算法比较的次数和为 (n - 1) + (n - 2) + … + 1,由此可得选择排序算法的时间复杂度为 O(n^2)。

插入排序

与选择排序一样,该算法将列表分为已排序部分和未排序部分。它会通过迭代未排序的部分将遍历到的元素插入到排序列表中的正确位置。

介绍

我们假设列表的第一个元素已排序。然后我们遍历到下一个元素,我们称之为 x。如果 x 值大于第一个元素,我们将继续遍历。如果 x 值较小,我们将第一个元素的值复制到第二个位置,然后将第一个元素值设置为 x。

当我们处理未排序部分的其他元素时,我们不断地将已排序部分中较大的元素向上移动,直到遇到小于 x 的元素或到达已排序部末尾的元素,然后将 x 放在正确的位置。

实现

def insertion_sort(nums):
    # 我们假设第一个元素已经排好序,然后从第二个元素开始遍历
    for i in range(1, len(nums)):
        item_to_insert = nums[i]
        # 同时保留上一个元素的下标的索引
        j = i - 1
        # 如果排序段的所有项大于要插入的项,则将其向前移动
        while j >= 0 and nums[j] > item_to_insert:
            nums[j + 1] = nums[j]
            j -= 1
        # 插入的元素
        nums[j + 1] = item_to_insert

# 验证算法是否正确
random_list_of_nums = [9, 1, 15, 28, 6]
insertion_sort(random_list_of_nums)
print(random_list_of_nums)

时间复杂度

在最坏的情况下,数组将按相反的顺序排序。插入排序函数中外层的for 循环总是会迭代n-1次。
在最坏的情况下,内部 for 循环将交换一次,然后交换两次,依此类推。交换的数量将是 1 + 2 + ... + (n - 3) + (n - 2) + (n - 1),这使得插入排序具有O(n^2) 的时间复杂度。

堆排序

这种流行的排序算法,像插入排序和选择排序一样,将列表分为已排序部分和未排序部分。它将列表的未排序段转换为数据结构堆,以便我们能有效地确定最大的元素。

介绍

我们首先将列表转换成一个最大堆 —— 一种最大元素为根节点的二叉树。然后把我们把这个节点放在列表的尾部。然后我们重建这个少了一个值的最大堆,将新的最大值放在列表的最后一项之前。
然后我们重复这个构建堆的过程,直到删除所有节点。

实现

我们创建一个辅助函数heapify 来帮助实现这个算法:

def heapify(nums, heap_size, root_index):
    # 设最大元素索引为根节点索引
    largest = root_index
    left_child = (2 * root_index) + 1
    right_child = (2 * root_index) + 2

    # 如果根节点的左子节点是有效索引,并且元素大于当前最大元素,则更新最大元素
    if left_child < heap_size and nums[left_child] > nums[largest]:
        largest = left_child

    # 对根节点的右子节点执行相同的操作
    if right_child < heap_size and nums[right_child] > nums[largest]:
        largest = right_child

    # 如果最大的元素不再是根元素,则交换它们
    if largest != root_index:
        nums[root_index], nums[largest] = nums[largest], nums[root_index]
        # 调整堆以确保新的根节点元素是最大元素
        heapify(nums, heap_size, largest)

def heap_sort(nums):
    n = len(nums)

    # 利用列表创建一个最大堆
    # range 的第二个参数表示我们将停在索引值为 -1 的元素之前,即列表中的第一个元素
    # range 的第三个参数表示我们朝反方向迭代
    # 将 i 的值减少1
    for i in range(n, -1, -1):
        heapify(nums, n, i)

    # 将最大堆的根元素移动到列表末尾
    for i in range(n - 1, 0, -1):
        nums[i], nums[0] = nums[0], nums[i]
        heapify(nums, i, 0)

# 验证算法是否正确
random_list_of_nums = [35, 12, 43, 8, 51]
heap_sort(random_list_of_nums)
print(random_list_of_nums)

时间复杂度

让我们先看看 heapify函数的时间复杂度。在最坏的情况下,最大元素永远不是根元素,这会导致递归调用 heapify 函数。虽然递归调用可能看起来非常损耗性能,但请记住,我们这里使用的是二叉树。

可视化一个包含 3 个元素的二叉树,它的高度为 2。现在可视化一个包含 7 个元素的二叉树,它的高度为 3。这棵树按对数方式增长到 n。heapify 函数在O(log(n))时间遍历该树。

heap_sort函数迭代数组 n 次。因此,堆排序算法的总时间复杂度为O(nlog(n))。

归并排序

这种分而治之的算法将一个列表分成两部分,并一直将剩下的列表分别一分为二直到列表中只剩下一个元素为止。

相邻元素成为排序对,然后合并排序对并和其它排序对进行排序。这个过程将一直持续到我们得到一个对未排序输入列表中所有元素排序的排序列表为止。

介绍

我们递归地将列表分成两半,直到得到长度为 1 的列表。然后我们合并被分割出的每一部分,在这个过程中对它们进行排序。

排序是通过比较每一半的最小元素来完成的。每个列表的第一个元素是第一个要比较的元素。如果前半部分以较小的值开头,那么我们将其添加到排序列表中。然后我们比较前半部分的第二个最小值和后半部分的第一个最小值。

每次我们在半段的开头选择较小的值时,我们都会移动需要比较的项目。

简介

def merge(left_list, right_list):
    sorted_list = []
    left_list_index = right_list_index = 0

    # 我们经常使用列表长度,因此将它创建为变量方便使用
    left_list_length, right_list_length = len(left_list), len(right_list)

    for _ in range(left_list_length + right_list_length):
        if left_list_index < left_list_length and right_list_index < right_list_length:
            # 我们检查每个列表开头的哪个值较小
            # 如果左列表开头的项较小,将它添加到已排序列表
            if left_list[left_list_index] <= right_list[right_list_index]:
                sorted_list.append(left_list[left_list_index])
                left_list_index += 1
            # 如果右列表开头的项较小,将它添加到已排序列表
            else:
                sorted_list.append(right_list[right_list_index])
                right_list_index += 1

        # 如果已到达左列表的末尾,则添加右列表中的元素
        elif left_list_index == left_list_length:
            sorted_list.append(right_list[right_list_index])
            right_list_index += 1
        # 如果已到达右列表的末尾,则添加左列表中的元素
        elif right_list_index == right_list_length:
            sorted_list.append(left_list[left_list_index])
            left_list_index += 1

    return sorted_list

def merge_sort(nums):
    # 如果列表中只有一个元素,则返回它
    if len(nums) <= 1:
        return nums

    # 使用向下取整获取中点,索引必须是整数
    mid = len(nums) // 2

    # 对每一半进行排序和合并
    left_list = merge_sort(nums[:mid])
    right_list = merge_sort(nums[mid:])

    # 将已排序的列表合并为新列表
    return merge(left_list, right_list)

# 验证算法是否正确
random_list_of_nums = [120, 45, 68, 250, 176]
random_list_of_nums = merge_sort(random_list_of_nums)
print(random_list_of_nums)

请注意,merge_sort() 函数与以前的排序算法不同,它返回一个已排序的新列表,而不是对现有列表进行排序。

因此,归并排序需要空间来创建和输入列表大小相同的新列表。

时间复杂度

我们首先看看 merge 函数。它需要两个列表,并迭代 n 次,其中 n 是两个列表合并后的大小。merge_sort 函数将给定数组拆分为 2 个,并递归地对子数组进行排序。由于递归的输入是给定数组的一半,就像二叉树一样,这使得处理所需的时间以对数方式增长到 n。
因此,归并排序算法的总体时间复杂性是 O(nlog(n))。

快速排序

这种分而治之的算法是本文中最常用的排序算法。如果合理地使用,那么它将具有很高的效率,并且不需要像归并排序一样使用额外的空间。我们围绕一个基准值对列表进行分区,并对基准值周围的元素进行排序。

介绍

快速排序首先对列表进行分区 —— 选择待排序列表的第一个值。该值被称为基准值。所有小于基准值的元素都将被移到其左侧。
此时基准值在正确的位置,我们递归地对基准值周围的元素进行排序,直到整个列表有序。

实现

# 快速排序分区有不同的方法,下面实现了 Hoare 的分区方案。Tony Hoare 还创建了快速排序算法。
def partition(nums, low, high):
    # 我们选择中间元素作为基准值。
    # 有些实现方法选择第一个元素或最后一个元素作为基准值。 
    # 有时将中间元素或一个随机元素作为基准值。
    # 还有很多可以选择或创建的方法。
    pivot = nums[(low + high) // 2]
    i = low - 1
    j = high + 1
    while True:
        i += 1
        while nums[i] < pivot:
            i += 1

        j -= 1
        while nums[j] > pivot:
            j -= 1

        if i >= j:
            return j

        # 如果 i 处的元素(在基准值左侧)大于 j 处的元素(在基准值右侧),则交换它们。
        nums[i], nums[j] = nums[j], nums[i]

def quick_sort(nums):
    # 创建一个辅助函数来进行递归调用
    def _quick_sort(items, low, high):
        if low < high:
            # 这是基准元素后的索引,我们的列表在这里被拆分
            split_index = partition(items, low, high)
            _quick_sort(items, low, split_index)
            _quick_sort(items, split_index + 1, high)

    _quick_sort(nums, 0, len(nums) - 1)

# 检验算法是否正确
random_list_of_nums = [22, 5, 1, 18, 99]
quick_sort(random_list_of_nums)
print(random_list_of_nums)

时间复杂度

最坏的情况是始终选择最小或最大元素作为基准值。这将创建一个大小为 n-1 的分区,导致递归调用 n-1 次。这导致在最坏情况下的时间复杂度为O(n^2)。

虽然最坏的情况比较糟糕,但快速排序仍然被大量使用,因为它的平均时间复杂度比其他排序算法快得多。虽然 partition函数使用嵌套的 while 循环,但它会对数组的所有元素进行比较以进行交换。因此,它的时间复杂度只有O(n)。

如果选择一个好的基准值,快速排序函数将把数组分成两部分,这两部分将随 n 呈对数增长。因此,快速排序算法的平均时间复杂度为O(nlog(n))。

Python 的内置排序函数

虽然理解这些排序算法是有益的,但在大多数 Python 项目中,你可能会使用语言中已经提供的排序函数。
我们可以更改列表,使其内容按sort()方法排序:

apples_eaten_a_day = [2, 1, 1, 3, 1, 2, 2]
apples_eaten_a_day.sort()
print(apples_eaten_a_day) # [1, 1, 1, 2, 2, 2, 3]

或者我们可以使用sorted()函数创建新的排序列表:

apples_eaten_a_day_2 = [2, 1, 1, 3, 1, 2, 2]
sorted_apples = sorted(apples_eaten_a_day_2)
print(sorted_apples) # [1, 1, 1, 2, 2, 2, 3]

它们都是按升序排序的,但你可以通过将reverse 标志设置为True 来轻松按降序排序:

# 对列表进行反向排序
apples_eaten_a_day.sort(reverse=True)
print(apples_eaten_a_day) # [3, 2, 2, 2, 1, 1, 1]

# 反向排序以获取新列表
sorted_apples_desc = sorted(apples_eaten_a_day_2, reverse=True)
print(sorted_apples_desc) # [3, 2, 2, 2, 1, 1, 1]

与我们创建的排序算法函数不同,这两个函数都可以对元组和类的列表进行排序。sorted() 函数可以对任何可迭代对象进行排序,其中包括了 —— 你可以创建的列表,字符串,元组,字典,集合,和自定义迭代器。

这些排序函数实现了Tim Sort算法,这是一种受归并排序和插入排序启发的算法。

速度比较

为了了解它们的执行速度,我们生成了一个介于 0 到 1000 之间的 5000 个数字的列表。然后我们计算每个算法完成所需的时间。每个算法运行 10 次,以便我们建立更可靠的性能模型。

下面是结果,时间以秒为单位:在这里插入图片描述如果你自己进行测试,你会得到不同的值,但是观察到的性能模型应该是相同或相似的。冒泡排序是所有算法中执行速度最慢、表现最差的。虽然它作为排序和算法的介绍很有用,但不适合实际使用。

我们还注意到快速排序非常快,它的速度几乎是归并排序的两倍,而且它在运行时不需要额外的空间。回想一下,我们的分区是基于列表的中间元素,不同的分区方法可能会有不同的结果。

由于插入排序执行的比较要比选择排序少得多,因此插入排序的实现通常更快,但在我们的测试中,选择排序会稍微快一些。

插入排序比选择排序交换元素的次数更多。如果交换值比比较值占用更多的时间,那么这个“相反”的结果是可信的。

选择排序算法时要注意使用场景,因为它会影响性能。

总结

排序算法为我们提供了许多排序数据的方法。我们研究了 6 种不同的算法——冒泡排序、选择排序、插入排序、归并排序、堆排序、快速排序 —— 以及它们在 Python 中的实现。

算法执行的比较和交换量以及代码运行的环境是决定性能的关键因素。在实际的 Python 应用程序中,建议我们坚持使用内置的 Python 排序函数,因为它们在输入和速度上具有灵活性。

  • 如有疑问,欢迎在评论区一起讨论!
  • 如有不正确的地方,欢迎指导!
华为od 面试八股文_C++_04_含答案 阅读详情

相关推荐

告别Quartus II的漫长等待:用VSCode+iverilog+GTKWave搭建你的轻量级Verilog仿真环境(2024保姆级教程)

本文详细介绍了如何利用VSCode、iverilog和GTKWave构建高效的Verilog/SystemVerilog开发环境,替代传统的Quartus II和ModelSim工具。通过2024年最新的保姆级教程,帮助开发者实现秒级启动、低资源消耗的轻量级仿真环境,显著提升数字电路设计的开发效率和调试体验。

weixin_33690963的博客 561

用python来排序

朋友们,我是床长! 如需转载请标明出处:http://blog.youkuaiyun.com/jiangjunshow 简介 有时,我们在应用程序中存储或检索的数据有可能是乱序的。如果想要正确处理或者有效使用数据,我们可能需要对数据重新排序。多年来,计算机科学家创造了许多排序算法来处理数据。 在本文中,我们将了解一些流行的排序算法,了解它们是如何工作的,并用 Python 来实现它们。们还将会比较...

人工智能AI技术 611

保姆级避坑指南:在Ubuntu 22.04上从零编译Autoware.universe(含ROS2 Humble和CUDA配置)

本文提供了一份详细的Autoware.universe编译指南,涵盖Ubuntu 22.04系统优化、ROS2 Humble安装避坑、CUDA配置及Demo运行技巧。通过分步操作和实战经验,帮助开发者高效完成环境搭建,避免常见错误,提升自动驾驶开发效率。

weixin_30642561的博客 351

list里面的数据按3个字段排序_轻松搞定数据分析之SQL——汇总分析

46年前,两位年轻的IBM研究人员在数据库上提出了一种新的语言,这是一种关系型语言,它奉行一切数据可以被声明性地操作和容易操作的思想。46年的时光里,它经历了许多数据库的诞生和消亡,也经历了许多数据处理方法的诞生和消亡,但直到今天,SQL依然是数据分析人员的必备技能,是关系型数据库的查询语言,每个BI工具都使用各种各样的SQL与数据交互,正如Lukas Eder 所说:“SQL是一种只有它自己的力...

weixin_39614322的博客 759

H.264 Profile与Level详解:如何为不同应用场景选择合适的编码配置

本文深入解析了H.264编码标准中的Profile与Level概念,指导开发者如何为不同应用场景选择合适的配置。文章对比了Baseline、Main和High三大Profile的特性与适用场景,并解释了Level如何限定视频的分辨率、帧率与码率上限。通过实战指南,帮助读者在视频通话、在线点播和专业制作等场景中,平衡画质、兼容性与性能,实现高效编码。

rgv2345678的博客 240

TiDB实战篇-数据库写入慢常见处理方式

TiDB实战篇-数据库写入慢常见处理方式

S1124654的博客 1011

springboot2.X手册:redis的7种类型100个方法全解析

Redis现有的数据类型:1、String类型一个键在原理上能存储512MB的数据(小编没有实验过,一般不存那么多),String类型在二进制上是安全的,可以存储任何数据,但是前提是需要...

程序员闪充宝 322

【前端】【面试】【业务场景】前端如何获取并生成设备唯一标识

问题:前端如何获取并生成设备唯一标识?核心要点:浏览器原生信息有限,但通过组合多个维度可生成设备指纹(Device Fingerprint),用于唯一标识设备。常见方式浏览器信息(User-Agent)屏幕与系统参数本地存储标识(localStorage / cookie)第三方指纹库(如 FingerprintJS)方式优点缺点手动组合指纹实现简单不稳定,识别率低持久化强容易被用户清除识别率高、稳定性好依赖第三方库IP 地址识别网络识别粗略共享网络环境下重复可能大。

qq_59344127的博客 1796

Python 冒泡法

Python 冒泡法

weixin_46121540的博客 1842

模拟量输入功能块 S_ITR(Easy系列PLC完整ST源代码)

IN Input INT 输入数字量 1IN ISH INT 输入数字量上限 2IN ISL INT 输入数字量下限 3IN OSH REAL 输出工程量上限 4IN OSL REAL 输出工程量下限 5OUT OUTPUT REAL 输出工程量 6VAR temp1 REAL 临时变量1 7VAR temp2 REAL 临时变量2 8。

RXXW_Dor的博客 716

Allegro如何改变线宽操作指导

用Allegro做pcb设计的时候,改变走线线宽是非常常用的功能,如下图。线宽目前是12mil,需要把线宽改成15mil。如何改变线宽操作指导。

weixin_54787054的博客 4255

Python基础排序算法之冒泡排序

#要点 冒泡排序实现原理 冒泡排序的代码实现及优化 冒泡排序的性能分析 冒泡排序实现原理 冒泡排序是一种相对而言比较简单,也是比较基础的排序算法。

qq_36766628的博客 319

【2022网易雷火】游戏研发笔试-AC代码及题目分享

3个小时,4道题目,雷火的题目不在于难,更在于对细节的把控和写大模拟的耐心,花了一个半小时,AC了3.85,直接交卷退了。第一题AC,第二题AC,第三题85%,第四题AC。下面分享一下大致的题意和对应的代码,就不多说了,最近很累(代码可能会有贴错的情况,如有望指正,感谢~)。 T1-小Y抽奖 题意 n行m列个奖励格子,每次抽奖消耗一个道具。每个格子奖励的数量有限且各不相司。每个格子被抽到一次,剩余的奖励数量-1。剩余的奖励数量为0时,则不会再抽到该格子。小Y抽了好多次,但一直没有抽到最想要的..

米莱虾 9266

用 Python 实现十大经典排序算法

10种经典排序算法包括冒泡排序、选择排序、快速排序、归并排序、堆排序、插入排序、希尔排序、计数排序、桶排序、基数排序等。 当然,还有一些其他的排序算法,大家可以继续去研究下。 01冒泡排序 冒泡排序(Bubble Sort)是一种比较简单的排序算法,它重复地走访过要排序的元素,依次比较相邻两个元素,如果它们的顺序错误就把他们调换过来,直到没有元素再需要交换,排序完成。 注:上图中,数字表示的是数据序列原始的索引号。 算法过程 比较相邻的元素,如果前一个比后一个大,就把它们两个对调位置。 ..

m0_59485658的博客 1万+

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

Python实现经典排序算法

Python实现经典排序算法冒泡排序选择排序插入排序希尔排序归并排序递归归并排序递归快速排序 import random lis=list(range(100)) random.shuffle(lis) print(lis) 冒泡排序 def bubbleSort(arr): for i in range(1,len(arr)): for j in range(0,len...

GQxxxxxl的博客 306

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

经典排序算法Python实现

经典排序算法python实现 目录 直接插入排序 二分插入排序 希尔排序 冒泡排序 快速排序 简单选择排序 堆排序 归并排序 基数排序 1. 插入排序 直接插入排序 #!/usr/bin/env python # -*- coding:UTF-8 -*- # AUTHOR: YancyKahn # FILE: D:\Work\408_863\DataStruct\Sorting\Ins...

YancyKahn 567

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Python实现十大经典排序算法

更多Python学习内容:ipengtao.com排序算法是计算机科学中的基本算法之一,广泛应用于数据处理和分析。本文将详细介绍用Python实现十大经典排序算法,包括冒泡排序、选择排序、插入排序、希尔排序、归并排序、快速排序、堆排序、计数排序、桶排序和基数排序。通过具体的示例代码,全面掌握这些基础算法。冒泡排序冒泡排序(Bubble Sort)是一种简单的交换排序算法,通过重复地遍历要排序的数组...

涛哥聊Python 1737

python实现经典排序算法

题目:分别实现冒泡排序,插入排序,快速排序的算法,并使用列表测试 #冒泡排序实现 def bubbleSort(data): if len(data) < 2: return data for i in range(0, len(data)-1): m = i for j in range(i

感悟编程 761

十大经典排序算法原理详解及其Python实现

文章目录摘要一、插入排序1、算法思想:2、举例演示:3、python实现4、复杂度和稳定性二、选择排序1、算法思想2、特点3、python实现3、复杂度和稳定性三、冒泡排序1、算法思想2、python实现3、复杂度和稳定性四、快速排序1、算法思想2、python实现3、复杂度和稳定性五、归并排序1、算法思想2、python实现3、复杂度和稳定性六、希尔排序1、算法思想2、python实现3、复杂度...

weixin_45459911的博客 1761

Python实现八大经典排序算法

1、写在前面的话 本篇博客并不涉及到排序算法的理论讲解,具体理论可以参考reference的链接,并且强烈推荐数据结构和算法的可视化网站【0】。本文给出八种经典的排序算法的Python实现代码和部分注解,算是一个总结,也感谢网络众多优秀的博主分享他们的idea,站在巨人的肩膀上果然成长很迅速。排序可以说在经典算法中是很重要的一部分,对于常见的排序算法要做到本能的敲出代码,了解各种算...

yinhui_zhang的博客 669

一起来用python实现一下十大经典排序算法呀

前言 既然之前很多小伙伴反应希望公众号多发点算法类的文章,那就来呗。先从简单的入手好了,带大家用python来实现一波十大经典排序算法呗。分别是: 冒泡排序; 选择排序; 插入排序; 希尔排序; 归并排序; 快速排序; 堆排序; 计数排序; 桶排序; 基数排序。 废话不多说,让我们愉快地开始吧~ 冒泡排序 基本原理 比较类排序算法。算法描述如下(假设是升序排序): 比较相邻的元素,如果第一个元素比第二个大,就交换它们; 对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对,这样在最后的元素应该会

Gtieguo的博客 1194

python算法口诀_经典排序算法的总结及其Python实现

经典排序算法总结:结论:排序算法无绝对优劣之分。不稳定的排序算法有:选择排序、希尔排序、快速排序、堆排序(口诀:“快速、选择、希尔、堆”)。其他排序算法均为稳定的排序算法。第一趟排序后就能确定某个元素最终位置的有:选择排序、冒泡排序、快速排序、堆排序。快速排序“偏爱”基本无序的序列。希尔排序的关键在于步长的选择,希尔排序的时间复杂度和步长的选择有关。快速排序之所以叫快速排序,并不代表它比堆排序、归...

weixin_39620118的博客 333

十种经典的排序算法的python实现

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录前言一、涉及的排序算法二、代码主代码调用方式、示例总结 前言 以下是十种经典排序算法的python代码展示,现已将代码封装为类,有错误的地方希望大家批评指正呀,大家共同探讨共同成长,加油加油!! 一、涉及的排序算法 十种经典的排序算法分别是:冒泡排序、选择排序、插入排序、希尔排序、归并排序、快速排序、堆排序、计数排序、桶排序和基数排序。(具体的介绍就不详细说明了,这位博主有很详细的介绍 (https://blog.csdn.n.

weixin_42377816的博客 1248

十大经典排序算法(基于Python实现)

排序算法是《数据结构与算法》中最基本的算法之一。排序算法可以分为内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存。常见的内部排序算法有:插入排序、希尔排序、选择排序、冒泡排序、归并排序、快速排序、堆排序、基数排序等。

yxn4065的博客 329

八种经典排序算法(python实现)

八种经典排序算法(python实现) 算法概述 冒泡排序 插入排序 选择排序 快速排序 希尔排序 归并排序 计数排序 桶排序 0、算法概述 0.1 算法分类 十种常见排序算法可以分为两大类: 比较类排序:通过比较来决定元素间的相对次序,由于其时间复杂度不能突破O(nlogn),因此也称为非线性时间比较类排序。 非比较类排序:不通过比较来决定元素间的相对次序,它可以...

sinceNow的博客 963
上一篇: 如何将你的 neovim 打造成 vscode 一般的 Python IDE?
下一篇: python实现DBSCAN算法
克金森沐沐
博客等级 码龄6年 694粉丝 64原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值