排序算法—插入排序之直接插入排序

直接插入排序就是从无序区,依次取出一个数据,通过大小比较,插入到有序区,直到数据全部有序为止。


下面是我对直接插入排序过程的一种理解,就像排序 扑克牌中的顺子一样:

首先假设你手中有 5 张扑克牌,依次是:4,2,5,3,1。

a.把牌背面面向你,现在你不清楚牌里面的数字。

b.从 左向右 翻一张牌  (现在,数字4 就是我们的有序区)

4  X X X X

c. 现在我们从 左向右 再翻开一张牌 它的名字叫 "card"(是数字 2)。

4 X X

d. 把 card 和 有序区 的牌,从右向左, 依次进行大小比较,规则如下: 

规则:如果 card 不 小于 有序区左邻的第一张牌(因为有序区 有序,所以card 不会小于 有序区任一张牌) ,则继续去下一张牌

规则二:如果 "card"小于有序区 的某张牌 B,就把 card 取出来,card的位置就空了出来;

然后把有序区 从牌 B(包括B)到末尾的全部牌右移一个位置(上面空位置消失),B的位置就空了出来;

最后把 card 放在 空的位置;


可见 2 < 4  ,那就把 2 抽出来 ,2的位置空了出来

4 _X X

把 4 移到2的位置,4的位置空了出来

_ X X X

最后把 2 放在空的位置

2 X X

e. 重复 步骤 c -d :

翻牌:

2 X 

比较并插入:(符合规则一)

2 5 X X

翻牌:

2 3 X

比较并插入:(符合规则二)

2 _ X

2 5 X

2 5 X


翻牌:

2 5 1

比较并插入:(符合规则二)

2 5 _

_ 4 5

1 4 5


排序完成


我的排序代码如下:

void insertsort(int a[],int n)
{
	int i =0;
	int j =0;

	int flag = 0;  //保存和有序区 比较的那个数字
	for(i =1;i<n;i++)//从第二个开始,第一个数作为有序区
	{
		flag =  a[i];
		for(j = i;j>0&&a[j-1]> flag;j--)
		{
			a[j] = a[j-1]; //向右移动有序区
		}
		a[j] = flag; //把数字 插入有序区
	}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值