Python排序算法之插入排序及其优化方案详解

Python排序算法之插入排序及其优化方案详解

排序算法是程序员必须学习的基本算法之一,而插入排序算法是其中较为简单和实用的一种,本文将详细介绍插入排序算法的原理以及其常见优化方案。

插入排序算法

插入排序算法是一种简单直观的排序算法,其基本思想是将一个待排序的序列分解成两个子序列,其中一个序列比另一个序列要少一个元素,然后将元素一个一个地从未排序的子序列中取出并插入到已排序的子序列中,直到未排序的子序列为空。

具体的实现步骤如下:

  1. 通过一个循环逐个取出未排序子序列中的元素;
for i in range(1, len(lst)):
    current = lst[i]
  1. 把当前元素插入到已排序子序列的合适位置中,从后向前遍历已排序子序列,依次比较已排序子序列中的元素,如果当前元素比已排序子序列中的某个元素大,则将该元素后移一位,直到找到合适的位置插入当前元素;
j = i - 1
while j >= 0 and lst[j] > current:
    lst[j + 1] = lst[j]
    j -= 1
lst[j + 1] = current
  1. 重复之前的步骤,直到未排序的子序列为空。

完整的插入排序算法的代码如下:

def insertion_sort(lst):
    for i in range(1, len(lst)):
        current = lst[i]
        j = i - 1
        while j >= 0 and lst[j] > current:
            lst[j + 1] = lst[j]
            j -= 1
        lst[j + 1] = current

插入排序算法的优化方案

尽管插入排序算法的实现简单易懂,但是其时间复杂度为$O(n^2)$,对于大量数据的排序可能会耗费较长时间,因此有必要对插入排序算法进行一些优化。

1. 二分查找插入

在已排序子序列中查找插入位置时,可以使用二分查找算法来加快查找速度。相比于从尾到头遍历已排序子序列,二分查找可以把时间复杂度降低到$O(log n)$。

具体的实现方式是,在已排序子序列中进行二分查找,找到第一个比当前元素大的位置,然后将当前元素插入到该位置之前。代码如下:

def insertion_sort(lst):
    for i in range(1, len(lst)):
        current = lst[i]
        left, right = 0, i - 1
        while left <= right:
            mid = (left + right) // 2
            if lst[mid] <= current:
                left = mid + 1
            else:
                right = mid - 1
        for j in range(i - 1, left - 1, -1):
            lst[j + 1] = lst[j]
        lst[left] = current

2. 缩小比较次数

在插入排序算法中,比较的次数会随着待排序序列的长度增加而增加。因此,可以通过一些技巧来减少比较的次数,从而提高算法的效率。

具体的实现方式有:

  • 使用赋值代替交换

交换两个元素的值需要进行3次赋值操作,因此可以考虑使用直接赋值的方式来实现。

python
def insertion_sort(lst):
for i in range(1, len(lst)):
current = lst[i]
j = i - 1
while j >= 0 and lst[j] > current:
lst[j + 1] = lst[j]
j -= 1
lst[j + 1] = current

  • 双重循环

在已排序子序列中,如果找到了一个比当前元素小的值,则可以直接跳出循环,从而减少比较次数。

python
def insertion_sort(lst):
for i in range(1, len(lst)):
current = lst[i]
for j in range(i - 1, -1, -1):
if lst[j] <= current:
break
lst[j + 1] = lst[j]
else:
lst[0] = current
continue
lst[j + 1] = current

示例说明

下面我们给出一个使用插入排序算法的实例:

lst = [5, 2, 3, 1, 4]
insertion_sort(lst)
print(lst)

输出为:

[1, 2, 3, 4, 5]

另外,我们再来看一下使用二分查找插入的实例:

lst = [5, 2, 3, 1, 4]
binary_insertion_sort(lst)
print(lst)

输出为:

[1, 2, 3, 4, 5]

从运行结果可以看出,使用了优化方案的插入排序算法比传统的插入排序算法要快,并且在处理较大的数据集时效果更加明显。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Python排序算法之插入排序及其优化方案详解 - Python技术站

(0)
上一篇 2023年5月19日
下一篇 2023年5月19日

相关文章

  • C语言实现九大排序算法的实例代码

    下面我会给您讲解如何实现九大排序算法的实例代码。 1. 排序算法简介 排序算法是计算机科学中重要的算法之一,是将元素按照一定规则进行排列的过程。常见的排序算法包括:冒泡排序、选择排序、插入排序、希尔排序、快速排序、归并排序、堆排序、计数排序和基数排序。 2. 实现九大排序算法的步骤 以下是九大排序算法的实现步骤: 冒泡排序:依次比较相邻的两个元素,将大的向后…

    算法与数据结构 2023年5月19日
    00
  • C语言简单实现快速排序

    C语言简单实现快速排序 什么是快速排序? 快速排序(Quicksort)是一种分治的排序算法,由Tony Hoare于1960年提出。快速排序使用两个指针i,j分别指向待排序数组的最左侧和最右侧,以一个值作为基准(pivot),一般为数组的中间值。快速排序的主要思路是将数组中小于基准值的数放到基准值左边,将大于基准值的数放到右边。然后通过递归的方式,对左右两…

    算法与数据结构 2023年5月19日
    00
  • c++ 快速排序算法【过程图解】

    C++ 快速排序算法【过程图解】 快速排序是一种常用的排序算法,其基本原理是通过分治的思想将待排序序列分成若干子序列,使得每个子序列都是有序的。具体实现时,首先选择一定的元素作为基准值,然后将比基准值小的元素全部放在基准值的左边,比基准值大的元素全部放在基准值的右边,这样就将序列分成了分别包含较小元素和较大元素的两个子序列。然后,递归地对子序列进行排序,最终…

    算法与数据结构 2023年5月19日
    00
  • JavaScript实现的七种排序算法总结(推荐!)

    JavaScript实现的七种排序算法总结(推荐!) 简介 本文介绍了JavaScript实现的七种排序算法,包括插入排序、冒泡排序、选择排序、希尔排序、归并排序、快速排序和堆排序。每种算法都有对应的JavaScript代码实现,并且详细说明了算法的原理、时间复杂度和代码实现过程。 插入排序 插入排序是一种简单的排序算法,它的基本思想是将数组分成已排序和未排…

    算法与数据结构 2023年5月19日
    00
  • PHP排序算法系列之桶排序详解

    PHP排序算法系列之桶排序详解 什么是桶排序? 桶排序是一种简单的排序算法,通过将待排序数组元素分别放到对应的桶中,然后在桶中对元素进行排序,最后将所有桶中元素合并得到有序的数组。 桶排序的步骤 创建一个数组作为桶,数组大小为待排序数组中的最大值加1,数组中每个元素初始化为0。 遍历待排序数组,将每个元素放到对应的桶中,即桶数组中下标为待排序元素的值的元素加…

    算法与数据结构 2023年5月19日
    00
  • Python利用treap实现双索引的方法

    Python利用treap实现双索引的方法 本文将介绍如何用Python语言实现基于treap的双索引方法来建立文本检索系统。 什么是treap? treap是一种二叉搜索树和堆(heap)的混合体。在treap中,每个节点包含一个键值和一个随机权重值。treap强制节点按照二叉搜索树的顺序排列,同时也保持堆的性质,即每个节点的权重都会小于其子节点的权重。这…

    算法与数据结构 2023年5月19日
    00
  • LeetCode 刷题 Swift 两个数组的交集

    LeetCode 是一个很受程序员欢迎的在线编程平台,提供了许多开发者解决问题的方法和思路。在 LeetCode 上,我们可以找到很多经典的算法问题,通过解决这些问题来提高自己对于算法和 Swift 编程的能力。本文将详细讲解如何使用 Swift 解决 LeetCode 中的两个数组的交集问题。 问题描述 给定两个数组,编写一个函数来计算它们的交集。 示例 …

    算法与数据结构 2023年5月19日
    00
  • php通过ksort()函数给关联数组按照键排序的方法

    如果需要将PHP关联数组按照键进行排序,可以使用ksort()函数。以下是使用ksort()函数给关联数组按照键排序的完整攻略: 第一步:创建一个关联数组 首先,创建一个包含多个元素的关联数组,这些元素都是键/值对。 $assoc_array = array( "name" => "John", "ag…

    算法与数据结构 2023年5月19日
    00
合作推广
合作推广
分享本页
返回顶部