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++实现快速排序(Quicksort)算法

    C++实现快速排序(Quicksort)算法 快速排序(Quicksort)算法是一种常见的排序算法,具有快速、高效、稳定性好等特点,广泛应用于各种工程实践中。 快速排序的基本思想 快速排序的基本思想是:选取一个基准值(pivot),将待排序序列划分成左右两个子序列,左边的子序列中所有元素都不大于基准值,右边的子序列中所有元素都不小于基准值,然后对左右两个子…

    算法与数据结构 2023年5月19日
    00
  • java简单选择排序实例

    Java简单选择排序是一种基于比较的排序算法,其基本思想是每次从待排序数据中选取最小(或最大)的元素,放到已排序的数据的末尾,直到所有元素都被排序完成。以下是Java简单选择排序实现的完整攻略: 算法步骤 遍历待排序的数组,每次选择最小的元素。 将已排序区间的末尾与最小元素进行交换。 扫描完整个数组,排序完成。 代码示例 下面给出了Java的简单选择排序的代…

    算法与数据结构 2023年5月19日
    00
  • JS使用单链表统计英语单词出现次数

    下面是JS使用单链表统计英语单词出现次数的完整攻略。 1. 理解单链表 单链表是一种常见的数据结构,也是一种线性结构,其中每个节点只有一个指针,指向它的后继节点。单链表一般由头指针和头结点组成,头结点不存放任何实际数据。在单链表中,节点可以进行插入、删除、查找等基本操作,是一种十分常用的数据结构。 2. 思路分析 要使用单链表统计英语单词出现次数,可以将单词…

    算法与数据结构 2023年5月19日
    00
  • PHP rsa加密解密算法原理解析

    PHP RSA加密解密算法原理解析 RSA是一种非对称加密算法,它使用两个密钥:公钥和私钥。公钥可以向外公开,用于加密数据;而私钥只由数据的持有者保管,用于解密数据。在本文中,我们会使用PHP实现RSA加密解密算法,并分享一些示例代码。 RSA加密解密算法原理 RSA加密解密算法的原理主要是基于数学中的大数分解问题和欧拉定理。以下是RSA算法的一般流程: 用…

    算法与数据结构 2023年5月19日
    00
  • C++STL函数和排序算法的快排以及归并排序详解

    C++ STL函数和排序算法的快排以及归并排序详解 1. 什么是STL? STL(Standard Template Library)是C++标准库中的一部分,它是由若干个模板类和函数构成的集合,提供了一些常用的数据结构和算法。 其中,数据结构包括vector(可变长数组)、list(双向链表)等,算法包括sort(排序)、find(查找)等。 2. STL…

    算法与数据结构 2023年5月19日
    00
  • Swift中排序算法的简单取舍详解

    Swift中排序算法的简单取舍详解 排序算法在编程中是非常常见的算法之一,从小到大或者从大到小排列一串数字列表,这是必不可少的需求。在Swift编程语言中,也提供了多种排序算法供我们使用。但是,不同的排序算法在排序过程中的时间复杂度和空间复杂度往往是不同的。因此,在实际的编程中,我们需要根据实际情况来选择合适的排序算法。本文将为大家详细讲解Swift中四种常…

    算法与数据结构 2023年5月19日
    00
  • PHP 快速排序算法详解

    PHP 快速排序算法详解 算法原理 快速排序(Quick Sort)是一种高效的排序算法,它的核心思想是分而治之,在序列中选择一个基准元素,将小于基准元素的值放置在基准元素左边,大于基准元素的值放置在基准元素右边,然后再对左右子序列分别执行同样的操作,直到序列有序为止。 具体实现过程如下: 选择一个基准元素 $pivot$,可以随机选择一个元素,也可以选择第…

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

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

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