不知道大家喜不喜欢打扑克?哈哈,我就挺喜欢的,尤其是三人斗地主,很喜欢.现在我来描述一幅画面看看大家熟不熟悉.
我抓牌的习惯是,在抓牌的时候,我要看着我的牌,看看牌的状况,有没有大小鬼,有几个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.如此这般才能使他们组成一个有序的队列.之后就还是按照这个思想继续迭代比较交换挪位置,直到最后.
在直接插入排序里,哨兵的运用是很巧妙的,需要大家仔细揣摩,吸收这种思想,在你以后编写的程序中运用到那就是极好了.但是这不是说说就做到了,还需要靠你的代码量,共勉吧,感谢大家.谢谢.