插入排序InsertSort-注意a[i]值的变化

在前面的几篇博客中,我们已经简单地探讨过冒泡排序选择排序快速排序了,今天,让我们来聊聊插入排序insertSort。
插入排序,顾名思义,就是在合适的地方插入元素,使得数组由小到大(由大到小)排列。
代码实现如下:

void InsertSort(int a[],int count) {
	int i,j;
	for(i = 1;i < count; i ++)	//第一次循环将0-1作为“有序区,使得a[0]和a[1]按从小到大的顺序排列 
	{							//之后每次循环将”有序区“向后扩展一位 
		int j = i - 1;
		int base = a[i];	//保存内循环开始之前a[i]的初值,默认它为”有序区中的最大值 
		while(j >= 0 && a[j] > base){	//注意,上一行有必要,因为内循环如果执行,a[i]的值会发生改变 
			a[j+1] = a[j];	//如果a[i]的前一个元素大于a[i],则将前一个元素放到a[i]的位置 
			j--; 
		}
		a[j+1] = base;	//将a[i]放到“有序区”中正确的位置 
	}
}
  • 注意:

1.外循环从i = 0或i = 1开始,设置“有序区”,使得下标小于等于i的元素从小到大(从大到小)依次排列(其实从如果从0开始,则在该次外循环中,内循环无法被执行,因为j = i -1 < 0,所以我们一般设置外循环从1开始)。

2.base = a[i]这个语句必须在内循环开始执行之前被定义,作用是将a[i]的初值保留下来。在定义base变量作为“有序区”的最大值后,根据条件执行内循环。如果内循环执行,则a[i]中的值会被原先的a[j]覆盖,所以实现要设置一个变量base来保存a[i]的初值。

3.“有序区”的元素已经是由小到大(由大到小)排列了,如果a[j]小于base,则a[j]之前的元素都小于base(因为它们都小于a[j])。

4.插入排序的思想是先构建一个”有序区“,然后把后面的元素一个个”插入“到”有序区“中正确的位置,使得每一次外循环执行过后,”有序区“的元素都按照从小到大(从大到小)的顺序排列。


利用srand()和rand()函数生成一组随机数(不了解的同学可以看看我之前的一篇博客C/C++中的srand()和rand()随机数函数),然后调用文章开头的InsertSort函数将储存在数组中的随机数进行排序,得到:

请输入数组长度:90个数为:301个数为:02个数为:253个数为:14个数为:35个数为:296个数为:57个数为:98个数为:6

排序后的数组为:
第0个数为:01个数为:12个数为:33个数为:54个数为:65个数为:96个数为:257个数为:298个数为:30

以上就是这篇关于插入排序的博客的主要内容了,大家可以点赞+关注哦~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值