今天很是得意终于将自己的一点心得拿出去分享,不想却受更大打击.本以为通过优化的冒泡算法足可以应付. 当我拿着前篇文章与惜日的同事(论起等级来此人算我的启蒙老师)交流的时候,又一次体现出了自己的菜.
经此君(我叫他啊明,龙港人,据说与我隔江相望十几年)不耐烦指点,终于领悟,冒泡实现起来容易,效率却是很低,相比快速排序,希尔排序等有其先天不足(上述2种排序,只大2数据结构时接触过,至于核心是什么,打从当初我就没有掌握过...汗)
由于今天开博第一天,哥哥心情好,晚上再写一篇,为了开这博客最近我可没少努力,专研了好些东西,继续努力修炼内功.
检 索
之所以在冒泡之后写关于检索的文章是因为这段时间看过了一些这方面的书籍,2者有着一定的联系.......
各位是否用过 IndexOf() 或者 LasIntdexOf() 用的时候有想起过他的原理吗? 呵呵 现在开发平台太先进了,类库太发达了,什么都给我们写好了,一般的开发人员是不必写什么检索方法,甚至不用去理它用就是了,(just use it)但是若甘于停留在这样的水平上想必很难有所大作为, 这也许就是有的人能用.net开发而不知道C#基本原理的原因吧,我自己也是这样,一段时间之后发现自己很难再进步了.周而复始地拖控件.设属性.用别人写好的东西.内功太重要了啊......(深受罗小平(大家应该认识吧)的影响)
在一堆文件,一本书中查找某个主题,一串数字中找出特定的一个等,这些都是检索.通过检索我们可以让计算机查阅大量的信息,得到我们想要的.
一:顺序检索
我们可以一个一个地找从最开始到最后,称这种方式为"线性" 如下:
for(int i ; i< list.length; i++)
{
if(list[ i ]==keyword)
return i;
else
return -1; //没有找到
}
一个个地检索,效率低下可想而知,那么我们是否可以利用冒泡来对检索做点贡献呢? 哈哈..... 相信大家都已经明白
二:二分检索
先将数组排序,然后重复用检索值与数组片段(会被不断地从中间处截断)的中间索引值进行比较,将数组分为2半,一半进一步检索,另一半舍弃. 如下:
int low=0 //初始低端,为数组开始下标
int higth=list.length-1 //初始高端,为数组结束下标
int middle
while(low<higth)
{
middle=(low+higth)/2;
if(keyword>list[ middle ]) //索引值在上半部分
low=middle+1; //重新设置low值,进行下次检索
else if(keyword<list[ middle ])
higth=middle-1;
else
return middle;
}
return -1; //没有检索到
二分检索的一个最重要的前提就是数组要循序排列好,这也就是我为什么要在冒泡之后写检索的原因所在了..