插入排序算法

插入排序算法:从无序区找元素插入到有序区内

0,42,15,20,6,8,38,50,12

注意r[0]当作哨兵

设【0,42】本身就是有序的,那么从第r[2]开始比较,这就是下面算法过程中i=2的原因

第一次for循环内容:

先把r[2]复制一份放在r[0],即有序序列变成【0,42】变成【15,42】

因为for循环的限制条件是r[0]<r[j],也就是拿r[1]~r[i-1]跟r[i]比较,即r[1]~r[1]跟r[2]比较

从r[i-1]开始比,r[j]=r[i-1]=r[2-1]=r[1]=42

r[0]是否小于r[j],也就是说15是不是小于42,是啊

那就复制一份42,把42右边的元素覆盖掉,序列【15,42,15】变成【15,42,42】

j减减,j=0, r[j]=r[0]=15,r[0]是否小于r[j],也就是说15是不是小于15,不是啊

那就把r[0]赋值给r[j+1],即把r[0]赋值给r[1],也就是说15赋值给42

序列【15,42,42】,变成【15,15,42】

第二次for循环内容:

目前序列为【15,15,42,20, 6, 8, 38, 50, 12】

此时i=3,i指向20,把20放到哨兵处

序列为目前序列为【20,15,42,20, 6, 8, 38, 50, 12】

j=i-1=3-1=2,指向42,看r[0]是否小于r[2],即20是不是小于42

是,那么把42复制一份干掉42右边的数字

此时序列为【20,15,42,42, 6, 8, 38, 50, 12】

j--,j变成1,r[0]不小于r[1],即20不小于15

那么把哨兵的位置复制,干掉r[1]前面的

此时序列为【20,15,20,42, 6, 8, 38, 50, 12】

=========================================================================

俩次挪动就完成了,接下来的步骤也是一样的,一共挪动7次,就不过多赘述了

#include <iostream>
using namespace std;
void InsertSort(int r[], int n) {
	int i, j;
	for (i = 2; i <= n; i++) {
    //2到n也就是2到8(包括2),就是7趟
		r[0] = r[i];
		for (j = i - 1; r[0] < r[j]; j--)
			r[j + 1] = r[j];
		r[j + 1] = r[0];
	}
	cout << "Insert排序结果" << endl;
	for (int i = 1; i <= 8; i++)
	{
		cout << r[i] << " ";
	}
	cout << endl;
}
int main()
{
	int a[]= {0,42,15,20,6,8,38,50,12};//a[0]是哨兵
	InsertSort(a,8);//8个数字比较7趟	
	return 0;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值