插入排序

起风了 Lv3

问题

特点

对于少量元素的排序,它是一个有效的算法。

理解

我觉得<<算法导论>>中讲的通俗易懂,引用至此:

插入排序的工作方式就像整理扑克牌。

开始时,我们的左手为空并且桌子上放着我们还没摸的牌(PS:他们都朝下放置在桌面上,等等这好像不重要吧)。然后我们每次从桌子上拿走一张牌并将它插入到左手中正确的位置(想想你打扑克牌的场景,是不是每摸一张就排下序=。=)。

为了找到一张牌的正确位置,我们从右到左将它一一与手中的每张牌进行比较。因此拿在左手上的牌总是排序好的。

代码

  1. 首先输入n个数字

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    int main(){
    int n;
    while(~scanf("%d",&n)){
    int *arr=new int[n]; //用指针开了动态数组,其他方法也可(毕竟这种容易出错)

    for(int i=0;i<n;i++)
    scanf("%d",&arr[i]); //输入n个数

    insertion_sort(arr,n); //调用“插入排序”函数

    for(int i=0;i<n;i++){
    printf("%d ",arr[i]); //将结果输出
    }
    printf("\n");

    delete []arr; //释放内存
    }
    }
  2. insertion_sort()定义如下:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    void insertion_sort(int arr[],int n){
    for(int i=1;i<n;i++){ //从第二张牌开始
    int key=arr[i]; //key为当前摸得牌
    int j=i-1; //j为左手拿的牌的最大的那个
    while(j>=0 && arr[j]>key){ //比较进行的条件,左手有牌且摸得牌还是比较小
    arr[j+1]=arr[j]; //把左手本轮参与比较的牌往右挪出一个牌的位置
    j=j-1; //换更小的牌
    }
    arr[j+1]=key;
    //循环后的结果有两种:
    //1.左手没牌了
    //2.当前左手这个牌比摸得牌还小、
    //无论哪种情况只需要将arr[j+1]=key即可
    }
    }
  3. 总代码:

    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
    #include<cstdio>

    void insertion_sort(int arr[],int n){
    for(int i=1;i<n;i++){ //从第二张牌开始
    int key=arr[i]; //key为当前摸得牌
    int j=i-1; //j为左手拿的牌的最大的那个
    while(j>=0 && arr[j]>key){ //比较进行的条件,左手有牌且摸得牌还是比较小
    arr[j+1]=arr[j]; //把左手本轮参与比较的牌往右挪出一个牌的位置
    j=j-1; //换更小的牌
    }
    arr[j+1]=key;
    //循环后的结果有两种:
    //1.左手没牌了
    //2.当前左手这个牌比摸得牌还小、
    //无论哪种情况只需要将arr[j+1]=key即可
    }
    }
    int main(){
    int n;
    while(~scanf("%d",&n)){
    int *arr=new int[n]; //用指针开了动态数组,其他方法也可(毕竟这种容易出错)
    for(int i=0;i<n;i++)
    scanf("%d",&arr[i]); //输入n个数
    insertion_sort(arr,n); //调用“插入排序”函数
    for(int i=0;i<n;i++){
    printf("%d ",arr[i]); //将结果输出
    }
    printf("\n");
    delete []arr; //释放内存
    }
    }
  • 标题: 插入排序
  • 作者: 起风了
  • 创建于 : 2022-03-22 12:47:43
  • 更新于 : 2026-09-25 23:19:00
  • 链接: https://www.wangcac.me/2022/03/22/插入排序/
  • 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。
评论
目录
插入排序