排序 Python

这篇博客详细介绍了Python中的四种排序算法:直接插入排序、折半插入排序、希尔排序、冒泡排序和快速排序。通过对每种排序算法的基本思路、可行性分析和代码实现的讲解,帮助读者深入理解这些排序方法的工作原理和应用。此外,还简要提及了简单选择排序和归并排序。
摘要由CSDN通过智能技术生成

目录

前言

一、插入排序

1.直接插入排序(Straight Insertion Sort)

(1)基本思路

(2)可行性分析

(3)代码实现

2.折半插入排序(Binary Insertion Sort)

(1)基本思路

(2)可行性分析

(3)代码实现

 3.希尔排序(Shell Sort)

(1)基本思路

(2)可行性分析

(3)代码实现

二、交换排序

1.冒泡排序

2.快速排序

三、选择排序

1.简单选择排序

四、归并排序

总结


前言

本文主要记录一下自己学习过程中的理解,如有错误或冗余欢迎指正与交流~

另,感谢g老师的悉心指导,ta是我的良师益友。

文章总结了插入排序、交换排序、选择排序、归并排序,依据自己的理解来介绍及记录。


一、插入排序

1.直接插入排序(Straight Insertion Sort)

(1)基本思路

Step 1 : 比较每一位(i)上的数与前一位(i - 1)数字的大小,并进行相应操作

        ① i 位上的数 >= i - 1位上的数:不做处理

        ② i 位上的数 < i - 1位上的数:将 i 位上的数暂存为某一变量,将 i - 1 位上的数放在 i 位上

Step 2 : 在Step 1 ② 的前提下,依次比较 i - 1 位前(j)的数字与原 i 位上的大小,并进行相应操作

        ① j 位上的数 <= 原 i 位上的数:不做处理

        ② j 位上的数 > 原 i 位上的数:将 j 位上的数往后挪一位

Step 3 : 在Step 2 中依次进行比较,直至遇到①的情况 ,即 j 位上的数 >= 原 i 位上的数。此时将 j + 1位上的数赋值为原 i 位上的数,实现 i 位上这一数字的直接插入排序

(2)可行性分析

假设:我们准备对 [5,1,4,3,2] 进行排序

对于第 0 位上的数字 5 ,由于它前面并没有数字可以比大小,所以可以当作一个有序的数组。

于是来看第 1 位上的数字 1 ,将会依次执行Step 1 ② 、Step 3 ,此时数组为 [1,5,4,3,2]

第 2 位上的数字 4 ,依次执行Step 1 ② 、Step 3,此时数组为 [1,4,5,3,2]

第 3 位上的数字 3 ,依次执行Step 1 ② 、Step 2 ②:第 1 位( j 位)上的数字 4 > 原第 3 位(原 i 位)上的数字 3 :将第 1 位( j 位)上的数字 4 往后挪一位,放在第 2 位上。由于第 2 位上的数字 5 在本次排序中的Step 1 ② 中就已经被放在了第 3 位上,所以此操作是可行的。再对前面的数字进行比较,由于第 0 位( j 位)上的数字 1 <= 原第 3 位(原 i 位)上的数字 3,Step 2 结束。Step 3:将原第 3 位(原 i 位)上的数字 3 放在第 1 位上。第 3 位上的数字 3 的直接插入排序结束。此时的数组为[1,3,4,5,2]

类似,第 4 位上的数字 2 ,依次执行Step 1 ② 、Step 2 、Step 3 ,最终直接插入排序完成,最终的数组为[1,2,3,4,5]

(3)代码实现

直接插入排序函数及调用的Python代码如下:

def InsertSort(A):
    lens = len(A)
    for i in range(1,lens):
        if A[i] < A[i - 1]:
            temp = A[i]
            A[i] = A[i - 1]
            j = i - 1
            while j >= 0 and temp < A[j]:
                A[j + 1] = A[j]
                j -= 1
            A[j + 1] = temp
    return A

InsertSort([5,1,4,3,2])

2.折半插入排序(Binary Insertion Sort)

(1)基本思路

法如其名,主要是利用二分查找的思想,找到数字插入的位置,并插入该数字即可。(可参见LeetCode 35. Search Insert Postion)

Step 1 : 找到第 i 位数的插入点

        ①将第 i 位前的数看作一个数组,找到该数组的左边界和右边界,并将第 i 位数存入某变量中

        ②二分查找,比较第 i 位数与中间位置上的数的大小,插入点为最终的右边界的右边一位

                a. 若第 i 位数 >= 中间位置上的数:将左边界更新为此时中间位置的右边一位

                b. 若第 i 位数 < 中间位置上的数:将右边界更新为此时中间位置的左边一位

Step 2 : 将最终的右边界的右边一位至第 i 位的左边一位依次向右挪动一位

Step 3 : 将第 i

  • 27
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值