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

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

眼睛可以近视,目光不能短浅。

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

相关文章:

你感兴趣的文章:

标签云: