《程序设计实践》读书笔记一

作者:朱金灿

来源:http://blog.csdn.net/clever101

 

 

 

  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. }

 

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

原文地址:https://www.cnblogs.com/lanzhi/p/6471186.html