作者:朱金灿<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />
来源:http://blog.csdn.net/clever101
- #include<stdio.h>
- #include<string.h>
- char*flab[]=
- {
- "actually",
- "just",
- "quite",
- "really",
- NULL
- };
- //顺序检索法算法
- intlookup(char*word,char*array[])
- {
- inti;
- for(i=0;array[i]!=NULL;i++)
- {
- if(strcmp(word,array[i])==0)
- {
- returni;
- }
- }
- return-1;
- }
- intmain(intargc,char*argv[])
- {
- printf("%d/n",lookup("quite",flab));
- return0;
- }
- typedefstructNamevalNameval;
- structNameval
- {
- char*name;
- intvalue;
- };
- Namevalhtmlchars[]=
- {
- "AElig",0x00c6,
- "Aacute",0x00c1,
- "Acirc",0x00c2,
- "zeta",0x03b6
- };
- //二分检索法源码
- intlookup2(char*name,Namevaltab[],intntab)
- {
- intlow,high,mid,cmp;
- low=0;
- high=ntab-1;
- while(low<=high)
- {
- mid=(low+high)/2;
- cmp=strcmp(name,tab[mid].name);
- if(cmp<0)
- high=mid-1;
- elseif(cmp>0)
- low=mid+1;
- else
- returnmid;
- }
- return-1;
- }
二分检索只能用在元素已经排好序的数组上。如果需要对某个数据集反复进行检索,先把它排序,然后再用二分检索就会是很值得的。如果数据集事先已经知道,写程序时就可以直接将数据排好序,利用编译时的初始化构建数组。
最好的排序算法之一是快速排序(quicksort)。快排的工作方式是:
从数组中取出一个元素(基准值)。
把其他元素分为两组:
“小的”是那些小于基准值的元素;
“大的”是那些大于基准值的元素。
递归地对这两个组做排序。
快排算法的一种实现如下:
- voidquicksort(intv[],intn)
- {
- inti,last;
- if(n<=1)
- return;
- //随机抽取数组的元素作为基准元素,并将它和第一个元素交换
- swap(v,0,rand()%n);
- last=0;//用于保存基准元素应该放置的位置
- //以基准元素为界,将数组元素分为两组
- for(i=0;i<n;i++)
- {
- if(v[i]<v[0])
- {
- swap(v,++last,i);
- }
- }
- //将基准元素放在数组准确的位置中
- swap(v,0,last);
- //对数组的前一部分进行快速排序
- quicksort(v,last);
- //对数组的后一部分进行快速排序
- quicksort(v+last+1,n-last-1);
- }
这时我脑海中产生的一个问题是:在一般情况下采用快排+二分检索是不是就比顺序检索快呢?思考:使用循环方式实现快排算法。