数据结构:Python实现直接插入排序(4)

直接插入排序是一种最简单的插入排序
这里我们主要学习直接插入升序排序。

1.什么是插入排序:
每一趟将一个待排序的记录,按照其关键字的大小插入到有序队列的合适位置里,直到全部插入完成。
例子:
在打扑克牌的时候:
你手里有一张5,
再摸到一张4,比5小,插到5前面,
又摸到一张6,比5大,插到5后面,
再摸到一张7,比6大,插到6后面

这就是典型的直接插入排序,每次将一个新数据插入到有序队列中的合适位置里。

2.算法思想:
假设我们现在有一组待排序的序列 D0,D1,D2,…,Nn-1
(1)我们先将这个序列下标为0的元素D0视为个数为1的有序序列
(2)然后,我们将D1,D2,…,Nn-1插入到这个有序序列中。所以,我们需要一个外部循环,从下标 1 扫描到 n-1 。
(3)假设这是要将 Di 插入到前面有序的序列中,由前面所述,我们可知,插入Di时,前 i-1 个数肯定已经是有序了。
所以我们需要将Di 和D0 ~ Di-1 进行比较,确定要插入的合适位置。这就需要一个内部循环,我们一般是从后往前比较,即从下标 i-1 开始向 0 进行扫描。

3.python3代码实现:

# -*- coding: utf-8 -*-
"""
Created on Wed Jul 10 11:44:36 2019

@author: ZQQ
"""

def insertSort(input_list):
    n = len(input_list) # 计算待排序序列长度
    if n <= 1:          # 已有序,或为空,直接返回
        return input_list
    else:
        # 第一层循环表示插入的遍数
        for i in range(1,n): # i取 1,2,3,..., n-1
            # 当前待插入的元素
            current = input_list[i]
            # 已经有序元素的索引
            pre_index = i - 1
            while pre_index >= 0 and input_list[pre_index] > current:
                # 当 比较元素 > 当前元素, 则把比较元素后移
                input_list[pre_index + 1] = input_list[pre_index]
                # 往前选择下一个比较元素
                pre_index -= 1
            # 当 比较元素 < 当前元素,或不满足pre_index>=0,则将 当前元素 插入其后面
            input_list[pre_index + 1] = current
            print(input_list)
        return input_list          
            
input_list = [6, 4, 8, 9, 2, 3, 1]
print('排序前:', input_list)
sorted_list = insertSort(input_list)
print('排序后:', sorted_list)   

实验结果:
在这里插入图片描述

4.算法分析:
插入排序的适用场景:一个新元素需要插入到一组已经是有序的数组中,或者是一组基本有序的数组排序。

(1)比较性:排序时元素之间需要比较,所以为比较排序
(2)稳定性:从代码我们可以看出只有比较元素大于当前元素,比较元素才会往后移动,所以相同元素是不会改变相对顺序稳定排序
(3)时间复杂度:插入排序同样需要两次循坏一个一个比较,故时间复杂度为O(n^2)
(4)空间复杂度:只需要常数个辅助单元,所以空间复杂度为O(1)
(5)复杂性:简单
注:当数据正序时,执行效率最好,每次插入都不用移动前面的元素,时间复杂度为O(N)。
当数据反序时,执行效率最差,每次插入都要前面的元素后移,时间复杂度为O(N^2)。
所以,数据越接近正序,直接插入排序的算法性能越好。
平均情况:O(N^2)

5.算法优化:
因为在一个有序序列中查找一个插入位置,以保证有序序列的序列不变,所以可以使用二分查找,减少元素比较次数提高效率
二分查找是对于有序数组而言的,假设如果数组是升序排序的,那么,二分查找算法就是不断对数组进行对半分割,每次拿中间元素和目标数字进行比较,如果中间元素小于目标数字,则说明目标数字应该在右侧被分割的数组中,如果中间元素大于目标数字,则说明目标数字应该在左侧被分割的数组中。

# -*- coding: utf-8 -*-
"""
Created on Wed Jul 10 15:46:21 2019

@author: ZQQ
"""
~~~python
# -*- coding:utf-8 -*-
 
def BinarySearch(input_list, end, value):
    left = 0
    right = end - 1
    while left <= right:
        middle = left + (right - left) // 2
        if input_list[middle] >= value:
            right = middle - 1
        else:
            left = middle + 1
 
    return left if left < end else -1
 
def BinaryInsertSort(input_list):
    if len(input_list) == 0:
        return []
    result = input_list
    for i in range(1, len(input_list)):
        j = i - 1
        temp = result[i]
        insert_index = BinarySearch(result, i, result[i])
        if insert_index != -1:
            while j >= insert_index:
                result[j + 1] = result[j]
                j -= 1
            result[j + 1] = temp
    return result
 

input_list = [6, 4, 8, 9, 2, 3, 1]
print('排序前:', input_list)
sorted_list = BinaryInsertSort(input_list)
print('排序后:', sorted_list)

参考和引用:

https://www.cnblogs.com/jingmoxukong/p/4303270.html

https://cuijiahua.com/blog/2017/12/algorithm_2.html

https://www.cnblogs.com/pig66/p/10598141.html

如有侵权,留言立删

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: 在 Python 中,你可以使用内置的 `sorted` 函数来对列表进行排序。例如: ```python numbers = [3, 4, 2, 1] sorted_numbers = sorted(numbers) print(sorted_numbers) # 输出: [1, 2, 3, 4] ``` 你也可以使用列表的 `sort` 方法来对列表进行排序。与 `sorted` 函数不同的是,`sort` 方法是在原地对列表进行排序,也就是说不会返回一个新的列表,而是直接修改原来的列表。例如: ```python numbers = [3, 4, 2, 1] numbers.sort() print(numbers) # 输出: [1, 2, 3, 4] ``` 你也可以使用 Python 的 heapq 库中的堆排序算法。堆排序是一种速度较快的排序算法,特别适用于海量数据的排序。例如: ```python import heapq numbers = [3, 4, 2, 1] heapq.heapify(numbers) # 将列表转化为堆 sorted_numbers = [] while numbers: sorted_numbers.append(heapq.heappop(numbers)) # 将堆中最小的数取出并放到结果列表中 print(sorted_numbers) # 输出: [1, 2, 3, 4] ``` 此外,Python 还提供了许多其他的排序算法,例如快速排序、归并排序等。你可以使用 Python 的 timeit 库来对不同的排序算法进行测试,以找出最快的排序算法。 ### 回答2: 数据结构是计算机科学中非常重要的一个概念,它是一种组织和存储数据的方式。而实现排序算法是数据结构中的一个重要应用。 在Python中,可以使用多种数据结构实现排序算法,比如列表、数组和堆等。下面我将介绍一种常用的排序算法——插入排序的Python实现。 插入排序是一种简单且常用的排序算法,它的基本思想是将待排序的元素一个一个地按照大小插入到已经排好序的列表中。具体步骤如下: 1. 创建一个新的空列表,作为存放已排序元素的容器。 2. 遍历待排序的列表,依次取出每个元素。 3. 将取出的元素与已排序元素的最后一个元素比较,如果取出的元素较小,则将它插入到已排序元素的末尾;如果取出的元素较大,则向前比较,找到合适的位置插入。 4. 重复步骤3,直到待排序列表中的所有元素都被取出并插入到已排序列表中。 5. 返回已排序的列表,即为排序结果。 下面是插入排序的Python实现代码: ```python def insertion_sort(arr): for i in range(1, len(arr)): key = arr[i] j = i - 1 while j >= 0 and arr[j] > key: arr[j + 1] = arr[j] j -= 1 arr[j + 1] = key return arr ``` 通过调用`insertion_sort`函数,传入待排序的列表,即可得到排序结果。 这就是数据结构中一种常用排序算法——插入排序的Python实现。当然,除了插入排序,还有许多其他排序算法也可以使用Python实现,比如冒泡排序、快速排序等。每种排序算法都有其特点和适用场景,可以根据具体需求选择合适的排序算法来使用。 ### 回答3: 数据结构是计算机存储、组织和管理数据的方式。在Python中,可以使用不同的数据结构实现排序算法。 常见的排序算法有冒泡排序、插入排序、选择排序、快速排序、堆排序和归并排序等。 冒泡排序是一种比较简单的排序算法,它重复地交换相邻的元素,直到整个序列有序为止。可以使用列表作为数据结构实现冒泡排序。 插入排序是一种较为直观的排序算法,它将未排序的元素逐个插入到已排序的部分中,构建有序序列。也可以使用列表实现插入排序。 选择排序是一种简单直观的排序算法,它每次选择未排序部分的最小元素,并将其与未排序部分的最左边元素交换位置。同样可以使用列表来实现选择排序。 快速排序是一种常用的排序算法,它使用分治的思想,将序列分为两个子序列,递归地排序子序列。同样可以使用列表作为数据结构实现快速排序。 堆排序是一种利用堆的数据结构来进行排序的算法,它通过不断地构建和调整堆来达到排序的目的。可以使用列表来实现堆排序。 归并排序是一种稳定的排序算法,它使用分治的思想,将序列分为两个子序列,递归地排序子序列,然后将两个有序子序列合并为一个有序序列。同样可以使用列表来实现归并排序。 总的来说,Python提供了多种数据结构和算法来实现排序操作,根据实际需求和性能要求选择适合的算法和数据结构

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

机器不学习我学习

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值