插入排序-算法导论笔记

  • 插入排序对于少量的数据它是一个有效的算法。插入排序的工作方式像人手里的扑克牌一样。开始时我们手里为空并且桌子上的牌面向下。然后我们每次从桌上拿走一张牌并将它插入手里正确的位置。为了把这种牌插入正确的位置,我们要从右到左将它和已在手中的牌进行比较。如下图:
    这里写图片描述

  • 伪代码:

INSERTION-SORT(A) { 
for j = 2 to A.length { 
key = A[j]; 
//Insert A[j] into the sorted sequence A[1...j-1]
i = j - 1; 
while i > 0 and A[i] > key { 
A[i+1] = A[i]; 
i = i - 1; 
} 
A[i+1] = key; 
} 
}
  • 我们声明一个数组 a = {5,2,4,6,1,3},下标j指正拿到的牌”当前牌”。在for循环的每次迭代的开始,包含元素a[1…j-1]的子数组构成当前已排序好的牌,剩余子数组a[j+1…n]对应于仍在桌上的牌堆。事实上,元素a[1…j-1]就是在原来的位置1到j-1的元素;再把过程用图表示一下。
    这里写图片描述

  • c语言代码实现:
    InsertSort.c

#include <stdio.h>
void insertSort(int *a);
int main() {
    int a[6] = { 5,2,4,6,1,3 };
    insertSort(a);
    int k;
    for (k = 0; k < 6;k++) {
        printf("%d ", a[k]);
    }
    getchar();
    return 0;
}


void insertSort(int *a) {
    int i, j,key;
    //这里是从第二个元素开始的
    for (j = 1; j < 6; j++) {
        key = a[j];
        //上一个元素
        i = j - 1;

        //数组下标0开始所以>=0
        while (i >= 0 && a[i] > key){
            a[i + 1] = a[i];
            i = i - 1;
        }

        a[i + 1] = key;
    }
}
  • 需要注意的是和伪代码有点不一样,伪代码只是实现思想for (j = 1; j < 6; j++)这里是从数组第二个元素开始的,数组从0开始,所以是j = 1;while (i >= 0 && a[i] > key)这里也是因为数组是0开始的,所以是>=0。

posted on   愤怒的苹果ext  阅读(27)  评论(0编辑  收藏  举报

编辑推荐:
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5
点击右上角即可分享
微信分享提示