1. #include <stdio.h>

  2. #include <string.h>



  3. char *flab[] = 

  4. {

  5.     "actually",

  6.     "just",

  7.     "quite",

  8.     "really",

  9.     NULL

  10. };



  11. // 顺序检索法算法

  12. int lookup(char *word,char *array[])

  13. {

  14.      int i;



  15.      for (i =0;array[i]!=NULL;i++)

  16.      {

  17.          if (strcmp(word,array[i])==0)

  18.          {

  19.              return i;

  20.          }

  21.      }



  22.      return -1;

  23. }



  24. int main(int argc, char* argv[])

  25. {

  26.     printf("%d/n",lookup("quite",flab));

  27.     return 0;

  28. }



  29. typedef struct Nameval Nameval;



  30. struct Nameval

  31. {

  32.      char *name;

  33.      int value;

  34. };



  35. Nameval htmlchars[] =

  36. {

  37.     "AElig", 0x00c6,

  38.     "Aacute", 0x00c1,

  39.     "Acirc", 0x00c2,

  40.     "zeta", 0x03b6

  41. };

  42. // 二分检索法源码

  43. int lookup2(char *name,Nameval tab[],int ntab)

  44. {

  45.      int low,high,mid,cmp;

  46.      low =0;

  47.      high = ntab-1;



  48.      while(low<=high)

  49.      {

  50.          mid = (low+high) /2;

  51.          cmp = strcmp(name,tab[mid].name);

  52.          if (cmp<0)

  53.               high = mid -1;

  54.          else if(cmp>0)

  55.              low = mid + 1;



  56.          else 

  57.              return mid;



  58.      }



  59.      return -1;

  60. }





     二分检索只能用在元素已经排好序的数组上。如果需要对某个数据集反复进行检索,先把它排序,然后再用二分检索就会是很值得的。如果数据集事先已经知道,写程序时就可以直接将数据排好序,利用编译时的初始化构建数组。


最好的排序算法之一是快速排序(quicksort)。快排的工作方式是:

从数组中取出一个元素(基准值)。

把其他元素分为两组:

“小的”是那些小于基准值的元素;

“大的”是那些大于基准值的元素。

递归地对这两个组做排序。


快排算法的一种实现如下:





  1. void quicksort(int v[],int n)

  2. {

  3.       int i,last;

  4.       if(n<=1)

  5.           return;

  6.     // 随机抽取数组的元素作为基准元素,并将它和第一个元素交换

  7.       swap(v,0,rand()%n);

  8.     last = 0; // 用于保存基准元素应该放置的位置



  9.     // 以基准元素为界,将数组元素分为两组

  10.     for (i = 0;i<n;i++)

  11.     {

  12.          if (v[i]<v[0])

  13.          {

  14.               swap(v,++last,i);

  15.          }

  16.     }



  17.     // 将基准元素放在数组准确的位置中

  18.     swap(v,0,last);

  19.     // 对数组的前一部分进行快速排序

  20.     quicksort(v,last);

  21.     // 对数组的后一部分进行快速排序

  22.     quicksort(v+last+1,n-last-1);



  23. }




这时我脑海中产生的一个问题是:在一般情况下采用快排+二分检索是不是就比顺序检索快呢?思考:使用循环方式实现快排算法。