名人说:古之立大事者,不惟有超世之才,亦必有坚忍不拔之志。——苏轼
进度:C/C++语言100题练习计划专栏,目前12/100
🐼本篇内容简介:一、排序算法-->二、问题呈现-->三、源码实现-->四、输出结果展示-->五、插入排序gif动画-->六、流程分析
🥇C语言100题练习专栏计划:目的:巩固练习C语言,增强上机、动手实践能力,交流学习!前期尽量每天更新一题,之后题量随时间的增加会有所增加。当然,内容也会不断地打磨优化。
C Programming Language
一、插入排序算法
插入排序(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😊)
如果对大家有帮助的话,希望大家能多多点赞+关注!这样我动力会更足哦! ღ( ´・ᴗ・` )比心
友情提示:第一篇为试看内容,关注博主就可以免费观看本专栏全部内容!(*^ ▽ ^ *)