使用Python插入排序

使用Python进行数据结构操作比较少见,但为了更深入的理解Python的操作原理,提升自己的算法能力。我决定认真过一遍 普林斯顿大学教授Robert Sedgewick主讲的《Algorithms》 更多见:李飞阳

【普林斯顿算法下载链接】普林斯顿大学教授Robert Sedgewick主讲的《Algorithms》

使用C++插入排序

#include<iostream>
using namespace std;
int main() {
    int a[] = { 4,3,9,0,1,2,5,6,7,8 };
    for(int i = 1; i < 10; i++) {
        int key = a[i];
        int j = i - 1;
        while (j >= 0&&a[j] > key) {
            a[j + 1] = a[j];  
            j--;
        }
        a[j + 1] = key;
    }
    for (int i = 0; i < 10; i++) {
        cout << a[i];
    }
    cout << endl;
    return 0;
}

这一段比较简单,我也就不多说了。

使用Python进行排序

data = [4,3,9,0,1]
for i in range(1,len(data)):
    key = data[i]
    j = i - 1
    while j >= 0 and data[j] > key:
            data[j+1]=data[j]
            j = j - 1
    data[j+1] = key
print(data)

总结:

  • Python的确比CPP简洁得多;
  • while循环体中条件部分可以使用 and ,不能用&&
  • python没有{},需要对齐,输入Tab或者敲空格。
<think>嗯,用户让我用Python实现插入排序。我需要先回忆一下插入排序的原理。插入排序应该是通过构建有序序列,对于未排序据,在已排序序列中从后向前扫描,找到相应位置插入。对吧? 首先,我得想清楚步骤。插入排序的工作方式像排序扑克牌。每次从桌子上拿一张牌,插入到左手已经排好序的牌中的正确位置。为了找到正确的位置,需要从右到左比较当前元素和已排序的元素。如果当前元素更小,就把已排序元素右移,直到找到合适的位置插入。 那具体到Python的实现,应该怎么做呢?可能需要一个循环来遍历组,从第二个元素开始,因为第一个元素默认已经是排序好的。然后对于每个元素,与前面的元素比较,如果前面的元素更大,就交换位置,或者找到合适的位置插入。 比如,假设有一个组arr,长度是n。外层循环从i=1到n-1,内层循环从j=i-1开始往前比较,如果当前元素arr[j]大于key(即arr[i]的值),就把arr[j+1] = arr[j],然后j减1。直到找到arr[j] <= key的位置,将key插入到j+1的位置。 不过,这里要注意,Python列表是可变的对象,所以可以直接修改。可能需要用到一个临时变量保存当前要插入的值,然后在内部循环中移动元素。 比如,正确的实现应该是这样的: def insertion_sort(arr): for i in range(1, len(arr)): key = arr[i] j = i - 1 while j >=0 and key < arr[j]: arr[j + 1] = arr[j] j -= 1 arr[j + 1] = key return arr 这样写的话,测试一下是否正确。例如,测试用例arr = [5, 2, 4, 6, 1, 3],排序后应该得到[1,2,3,4,5,6]。需要确认这个过程是否正确。 然后需要解释每一步的作用。外层循环遍历每个元素,内层循环处理当前元素之前的已排序部分,将较大的元素后移,找到合适的位置插入当前元素。 时间复杂度方面,插入排序是O(n²)的平均和最坏情况,最好情况是O(n)当组已经有序的时候。空间复杂度是O(1),因为是原地排序。 可能需要给出示例代码,解释代码的执行过程。例如,初始组是[5,2,4,6,1,3],第一次循环i=1,key=2,j=0,比较5和2,5>2,所以将5后移到位置1,然后j变成-1,循环结束,将key放在位置0。此时组变为[2,5,4,6,1,3]。接着i=2,key=4,j=1,比较5>4,5后移,j=0,比较2<=4,停止,插入到j+1=1的位置,组变成[2,4,5,6,1,3]。依此类推。 可能用户还需要知道插入排序的优缺点。比如,适合小规模据或部分有序的据,稳定排序算法,不需要额外空间。但效率不如快速排序、归排序等高级算法。 最后,要确保代码的语法正确,比如在Python使用range函,索引是否正确,以及循环条件是否覆盖所有情况。比如,内部的while循环需要检查j>=0,否则会越界。</think>### 逐步解释:Python实现插入排序 插入排序是一种简单直观的排序算法,其核心思想是将未排序元素逐个插入到已排序序列的正确位置。以下是详细实现步骤: --- #### **1. 算法原理** - **基本思路**:将组分为**已排序区间**和**未排序区间**。初始时,已排序区间仅包含第一个元素,之后逐个将未排序区间的元素插入到已排序区间的正确位置。 - **时间复杂度**: - 最优:$O(n)$(当输入组已有序) - 平均和最差:$O(n^2)$ - **空间复杂度**:$O(1)$(原地排序) - **稳定性**:稳定(相等元素的相对顺序不变) --- #### **2. Python代码实现** ```python def insertion_sort(arr): # 遍历从第二个元素到最后一个元素(索引1到n-1) for i in range(1, len(arr)): key = arr[i] # 当前待插入的元素 j = i - 1 # 已排序区间的末尾索引 # 将比key大的元素依次后移 while j >= 0 and key < arr[j]: arr[j + 1] = arr[j] j -= 1 # 将key插入正确位置 arr[j + 1] = key return arr ``` --- #### **3. 逐步拆解** 以组 `[5, 2, 4, 6, 1, 3]` 为例: 1. **初始状态**:已排序区间为 `[5]`,未排序区间为 `[2,4,6,1,3]` - `i=1`, `key=2`, `j=0` - 比较 `5 > 2` → 将 `5` 后移 → 插入 `2` → 组变为 `[2,5,4,6,1,3]` 2. **第二轮**:已排序区间为 `[2,5]`,未排序区间为 `[4,6,1,3]` - `i=2`, `key=4`, `j=1` - 比较 `5 > 4` → 将 `5` 后移 → 比较 `2 < 4` → 插入 `4` → 组变为 `[2,4,5,6,1,3]` 3. **后续步骤**:重复此过程,直到所有元素有序。 --- #### **4. 测试验证** ```python arr = [5, 2, 4, 6, 1, 3] print(insertion_sort(arr)) # 输出:[1, 2, 3, 4, 5, 6] ``` --- #### **5. 关键点分析** - **内层循环条件**:`j >= 0` 确保不越界,`key < arr[j]` 确定插入位置。 - **元素移动逻辑**:通过 `arr[j + 1] = arr[j]` 后移元素,腾出插入空间。 - **插入位置**:最终 `arr[j + 1] = key` 将元素放入正确位置。 --- #### **6. 应用场景** - 小规模据($n \leq 1000$) - 输入据基本有序时效率高 - 需要稳定排序且空间有限的场景 插入排序的直观性和低空间复杂度使其在某些场景下仍具优势,但需注意其时间复杂度在大据量下的局限性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值