【算法】插入排序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++){	
		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.如此这般才能使他们组成一个有序的队列.之后就还是按照这个思想继续迭代比较交换挪位置,直到最后.


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

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。