zoukankan      html  css  js  c++  java
  • 《程序设计实践》读书笔记一

    作者:朱金灿

    来源: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. }

     

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

  • 相关阅读:
    最大似然估计
    信号和槽:Qt中最差劲的创造
    从生物神经网络到人工神经网络
    巩固一下C语言中的指针
    linux启动后自动登录并运行自定义图形界面程序
    删除linux系统服务
    《痞子衡嵌入式半月刊》 索引
    痞子衡嵌入式:恩智浦i.MX RTxxx系列MCU开发那些事
    痞子衡嵌入式:高性能MCU之音视频应用开发那些事
    痞子衡嵌入式:恩智浦i.MX RT1xxx系列MCU开发那些事
  • 原文地址:https://www.cnblogs.com/lanzhi/p/6471186.html
Copyright © 2011-2022 走看看