【算法】直接插入排序C语言实现

不知道大家喜不喜欢打扑克?哈哈,我就挺喜欢的,尤其是三人斗地主,很喜欢.现在我来描述一幅画面看看大家熟不熟悉.


我抓牌的习惯是,在抓牌的时候,我要看着我的牌,看看牌的状况,有没有大小鬼,有几个2,有没有长的连,顺便做好基本的排序工作.比如我第一张牌抓的是7,放在手里,第二张牌是J,我把它放在7的后面(对,我默认是左到右升序的的),第三张是10,我把它放在7和J之间,第四张牌还是10,那么我就有两个位置可以防止这个刚刚到来的10,一是把他放在J的前面,二是把它放在第一个10的前面也就是7的后面,这两种方法都是可取的(处女座还要比一下花色然后选择放置的位置,你伤不起啊大笑),以此类推,直到抓完你所有该抓的牌,OK,叫地主,抢地主,开干.


卧槽这满满的画面感.


有的人此时就会问了,你不是要讲插入排序吗,怎么扯到了斗地主上去?对于这样的同学,我只能说这个问题问的很好.请容我跪着给你解开疑惑.


不知道大家有没有发现我们抓牌的时候就一直在做插入和比较(比较牌的大小)的操作,其实我们今天要讲的插入排序和抓牌的原理几乎是一模一样的,之所以先跟大家斗一会儿地主,是为了预热一下,让大家能更好地理解代码的实现原理和这之间的思路.


好了说了这么多,还是上代码吧:


void insert_sort(int array[], int length){
	int i;
	int j;
	
	int temp;	//在这里temp是作为哨兵,监视array[i]的值
	for(i=1; i<length; i++){	//此处i从1开始是因为我们首先做的是把第1个元素插入到第0个元素组成的序列中
		if(array[i] < array[i - 1]){	//此时,array[i]之前的序列已经是有序状态
			temp = array[i];			//寄存array[i]的值
			for(j=i-1; array[j]>temp; j--){		//找到第一个不大于temp即array[i]的值,循环就结束
				array[j + 1] = array[j];		//将array[j]向后挪一个位置
			}
			array[j + 1] = temp;				//把哨兵存储的array[i]的数值填到最后剩下来的那个正确位置.
		}										//这样使得array[0]~array[i]为有序的
	}
}



看完代码及注释还是不懂的话,请冷静冷静.想象一下,我们在一个序列最开始的第一个元素算是一个序列吧,因为它只有一个元素,所以它一定是有序的.这样我们就拿他的下一个元素来和它进行组合,成为一个两个元素的序列,然后再比较它们的大小,如果后一个元素[之后称它为rear]比前一个元素[之后称它为front]小的话,那么就先把rear存到temp这个哨兵这里,然后front向后挪一位,覆盖原来的front,这时候我们没必要担心front的值会丢失,因为我们早就把rear的值存放在哨兵temp里了(现在看出了哨兵的作用了吧!),最后把哨兵的值再传给front.如此这般才能使他们组成一个有序的队列.之后就还是按照这个思路继续迭代比较交换挪位置,直到最后.直接插入排序的时间复杂度是O(n^2).


在直接插入排序里,哨兵的运用是很巧妙的,需要大家仔细揣摩,吸收这种思想,在你以后编写的程序中运用到那就是极好了.但是这不是说说就做到了,还需要靠你的代码量的支撑,共勉吧,感谢大家.谢谢.

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值