C语言100题练习计划 12——插入排序怎么写?

名人说:古之立大事者,不惟有超世之才,亦必有坚忍不拔之志。——苏轼
进度:C/C++语言100题练习计划专栏,目前12/100

🐼本篇内容简介一、排序算法-->二、问题呈现-->三、源码实现-->四、输出结果展示-->五、插入排序gif动画-->六、流程分析

🥇C语言100题练习专栏计划目的:巩固练习C语言,增强上机、动手实践能力,交流学习!前期尽量每天更新一题,之后题量随时间的增加会有所增加。当然,内容也会不断地打磨优化。

一、插入排序算法

插入排序(Insertion sort)的介绍:

1. 基本思想

将元素逐个添加到已经排序好的数组中去,同时要求,插入的元素必须在正确的位置,这样原来排序好的数组是仍然有序的。

2. 优缺点
  • 优点:稳定,比较次数已知;
  • 缺点:慢,每次只能移动相邻两个数,移动次数多。
3.算法具体步骤

通常是排序整个无序数组,所以把这个无序数组分为两部分排序好的子数组和待插入的元素。第一轮时,将第一个元素作为排序好的子数组,插入第二个元素;第二轮,将前两个元素作为排序好的数组,插入第三个元素。以此类推,第i轮排序时,在前i个元素的子数组中插入第i+1个元素。直到所有元素都加入排序好数组。

二、问题呈现

Problem Description

给定数组元素为:3,44,38,5,47,15,36,26,27,2,46,4,19,50,48。使用插入排序对其进行降序排序

Input

Output

数组元素降序排序后的结果

Sample Input

Sample Output

50 48 47 46 44 38 36 27 26 19 15 5 4 3 2

三、源码实现(+注释)
#include <stdio.h>
//插入排序函数
void Insertion_sort(int a[], int len){
        int i,j,key;
        //进行len-1轮插入排序过程
        for (i=1;i<len;i++){
                key = a[i];
                j=i-1;
                while((j>=0) && (a[j]<key)) {//降序排序
                        a[j+1] = a[j];
                        j--;
                }
                a[j+1] = key;
        }
}
//主函数
int main() {
        int a[] = {3,44,38,5,47,15,36,26,27,2,46,4,19,50,48};
        int len = (int)sizeof(a)/sizeof(*a);
        //调用插入排序函数进行排序
        Insertion_sort(a, len);
        int i;
        //循环输出排序后的结果:
        for (i = 0; i < len; i++)
            printf("%d ", a[i]);
        return 0;
}

while((j>=0) && (a[j]<key)) //降序实现条件 如果是升序 将a[j] < key 改为 a[j] > key就可以了。

四、输出结果展示
50 48 47 46 44 38 36 27 26 19 15 5 4 3 2
--------------------------------
Process exited after 0.3114 seconds with return value 0
请按任意键继续. . .
五、插入排序gif动画:

在这里插入图片描述

六、流程分析
1.读题

给定数组元素为:3,44,38,5,47,15,36,26,27,2,46,4,19,50,48。使用插入排序对其进行降序排序。关键点 ①给定元素内容 ②插入排序 ③降序排序

2.构思

根据第一个关键点给定元素内容,可以先定义一个整数类型的数组对其进行存储,方便后续使用循环对其进行操作。
第二个关键点就是插入排序,使用插入排序,思想就是将元素逐个添加到已经排序好的数组中去,同时要求,插入的元素必须在正确的位置,这样原来排序好的数组是仍然有序的。 理解其思想后,插入排序就很好实现了。
第三个关键点降序排序,那就是让数值大的放前边,数值小的放后边, 插入排序通常是排序整个无序数组,所以把这个无序数组分为两部分排序好的子数组和待插入的元素,所以降序排序借助循环排序的话,需要两个条件同时成立,(j>=0) && (a[j]<key)。
解决了这些,可以实现了。

3.编程

把你所思所想,以代码的形式,写出来。

Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊)
如果对大家有帮助的话,希望大家能多多点赞+关注!这样我动力会更足哦! ღ( ´・ᴗ・` )比心
友情提示:第一篇为试看内容,关注博主就可以免费观看本专栏全部内容!(*^ ▽ ^ *)

  • 5
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Code_流苏

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

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

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

打赏作者

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

抵扣说明:

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

余额充值