码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2015-02-06 11:28:33      阅读:165      评论:0      收藏:0      [点我收藏+]

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


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

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

标签:排序   算法   c语言   

原文地址:http://blog.csdn.net/lchad/article/details/43546701

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!