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日

相关文章

  • 如何利用Python动态展示排序算法

    首先,我们需要了解一下Python中常用的用于动态展示的库——matplotlib和pygame。 matplotlib是一个数据可视化库,它可以让我们轻松地创建各种静态和动态的图形,包括折线图、柱形图等等,而pygame则是一个开源的游戏开发库,它专用于创建游戏和动态图形。 接下来,我们就可以使用这两个库来展示排序算法了。 下面是一个示例,展示了如何使用m…

    算法与数据结构 2023年5月19日
    00
  • JS实现的合并两个有序链表算法示例

    下面为您详细讲解JS实现的合并两个有序链表算法示例的完整攻略。 什么是合并两个有序链表? 合并两个有序链表,顾名思义就是将两个有序链表合并成一个有序链表。具体实现过程是将链表A和链表B按照顺序依次比较,将较小的节点插入到一个新的链表C中,直至A、B中有一个链表被遍历结束,另一个链表中剩余的节点则直接插入到链表C的最后。 示例如下: 链表A 链表B 合并后的链…

    算法与数据结构 2023年5月19日
    00
  • 基于Go语言实现冒泡排序算法

    基于Go语言实现冒泡排序算法 什么是冒泡排序 冒泡排序(Bubble Sort)是一种简单的排序算法,它重复地遍历要排序的数列,一次比较两个元素,如果它们的顺序错误就把它们交换过来。遍历数列的工作是重复地进行,因而得名“冒泡排序”。该算法因其简单的实现方式和易于理解的原理而广泛应用。 冒泡排序算法实现方式 冒泡排序的算法原理如下: 比较相邻的元素。如果第一个…

    算法与数据结构 2023年5月19日
    00
  • PHP大转盘中奖概率算法实例

    下面是一份完整的攻略,讲解如何实现一个PHP大转盘中奖概率算法: 问题描述 如何实现一个PHP大转盘中奖概率算法?也即,在一个转盘上设置几个奖项,每个奖项有对应的中奖概率,随机抽取中奖项并输出对应的奖品。 思路分析 为了实现大转盘的中奖概率算法,需要从以下几个方面入手: 定义奖项:确定奖品数量和对应的中奖概率 生成随机数:使用PHP的rand()函数生成随机…

    算法与数据结构 2023年5月19日
    00
  • C语言实现数组元素排序方法详解

    C语言实现数组元素排序方法详解 概述 数组元素排序是C语言中常见的操作,它将数组中的元素按照一定的规则进行排序,使其符合特定的要求。常见的排序方法包括冒泡排序、插入排序、选择排序、快速排序等。 本文将详细讲解C语言实现数组元素排序的方法,包括上述四种排序方法的原理、代码实现,帮助初学者快速入门。 冒泡排序 冒泡排序是一种简单的排序方法,它依次比较相邻的两个元…

    算法与数据结构 2023年5月19日
    00
  • Golang算法问题之数组按指定规则排序的方法分析

    下面是“Golang算法问题之数组按指定规则排序的方法分析”的完整攻略: 前言 数组排序是算法问题的一个经典案例,今天将介绍如何使用 Go 语言对数组按照指定规则排序的方法。 算法分析 冒泡排序 冒泡排序是一种非常经典的排序算法,其基本思想是重复地走访过要排序的元素列,每次比较相邻的两个元素,如果它们的顺序错误就交换它们的位置。具体实现方式如下: func …

    算法与数据结构 2023年5月19日
    00
  • php数组冒泡排序算法实例

    让我们来详细讲解一下“PHP 数组冒泡排序算法实例”。 什么是冒泡排序? 冒泡排序算法是一种基于比较的排序算法,它重复地遍历要排序的列表,比较相邻的两个元素,如果它们的顺序错误,就将它们交换位置。这个过程直接比较相邻元素,每一轮都将最小的元素放到序列的开头,就像气泡不断上升一样,因此得名冒泡排序。 基本的冒泡排序实现方法 下面是一个基本的实现方法,用 PHP…

    算法与数据结构 2023年5月19日
    00
  • 华为笔试算法题汇总

    下面是“华为笔试算法题汇总”的完整攻略: 一、题目来源 本篇攻略总结了华为笔试中常见的算法题目,这些题目可以在华为科技招聘官网上的笔试环节中出现。 二、题目类型 华为笔试中常见的算法题目主要包括: 字符串操作:如字符串反转、字符串查找等; 数组排序:如快排、归并排序等; 链表操作:如链表反转、链表合并等; 动态规划问题:如背包问题、最长公共子序列等; 图论问…

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