作者:朱金灿
来源:http://blog.csdn.net/clever101
- #include <stdio.h>
- #include <string.h>
- char *flab[] =
- {
- "actually",
- "just",
- "quite",
- "really",
- NULL
- };
- // 顺序检索法算法
- int lookup(char *word,char *array[])
- {
- int i;
- for (i =0;array[i]!=NULL;i++)
- {
- if (strcmp(word,array[i])==0)
- {
- return i;
- }
- }
- return -1;
- }
- int main(int argc, char* argv[])
- {
- printf("%d/n",lookup("quite",flab));
- return 0;
- }
- typedef struct Nameval Nameval;
- struct Nameval
- {
- char *name;
- int value;
- };
- Nameval htmlchars[] =
- {
- "AElig", 0x00c6,
- "Aacute", 0x00c1,
- "Acirc", 0x00c2,
- "zeta", 0x03b6
- };
- // 二分检索法源码
- int lookup2(char *name,Nameval tab[],int ntab)
- {
- int low,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;
- else if(cmp>0)
- low = mid + 1;
- else
- return mid;
- }
- return -1;
- }
二分检索只能用在元素已经排好序的数组上。如果需要对某个数据集反复进行检索,先把它排序,然后再用二分检索就会是很值得的。如果数据集事先已经知道,写程序时就可以直接将数据排好序,利用编译时的初始化构建数组。
最好的排序算法之一是快速排序(quicksort)。快排的工作方式是:
从数组中取出一个元素(基准值)。
把其他元素分为两组:
“小的”是那些小于基准值的元素;
“大的”是那些大于基准值的元素。
递归地对这两个组做排序。
快排算法的一种实现如下:
- void quicksort(int v[],int n)
- {
- int i,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);
- }
这时我脑海中产生的一个问题是:在一般情况下采用快排+二分检索是不是就比顺序检索快呢?思考:使用循环方式实现快排算法。