1. 程式人生 > >C/C++:各種基本演算法實現小結(六)—— 查詢演算法

C/C++:各種基本演算法實現小結(六)—— 查詢演算法

各種基本演算法實現小結(六)—— 查詢演算法

(均已測試通過)

===================================================================

1、簡單查詢

在一組無序數列中,查詢特定某個數值,並返回其位置pos

測試環境:VC 6.0 (C)

[cpp] view plain copy  print?
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <time.h>
  4. #define MAX 101
  5. void input(int num[])  
  6. {  
  7.     int i;  
  8.     srand((unsigned)time(NULL));  
  9.     for(i=1; i<MAX; i++)  
  10.         num[i]=rand()%100;  
  11. }  
  12. void output(int num[])  
  13. {  
  14.     int i;  
  15.     for(i=1; i<MAX; i++)  
  16.     {  
  17.         printf("%5d", num[i]);  
  18.         if(0==i%10)  
  19.             printf("/n");  
  20.     }  
  21. }  
  22. int find(int num[], 
    int x)  
  23. {  
  24.     int i;  
  25.     for(i=1; i<MAX; i++)  
  26.         if(x == num[i])  
  27.             return i;  
  28.     return 0;  
  29. }  
  30. void main()  
  31. {  
  32.     int x, pos, num[MAX];  
  33.     input(num);  
  34.     printf("num...: /n");  
  35.     output(num);  
  36.     printf("Enter find num: ");  
  37.     scanf("%d", &x);  
  38.     pos=find(num, x);  
  39.     if(pos)  
  40.         printf("OK! %d is found in pos: %d/n", x, pos);  
  41.     else
  42.         printf("Sorry! %d is not found... in num/n", x);  
  43. }  

執行結果:

  

==========================================================

2、 折半查詢

在有序數列中,逐步縮小查詢範圍,直至找到或找不到記錄為止

本演算法首先隨機生成100個無序數列,然後利用快速排序演算法排序成有序數列,然後再用折半查詢演算法

說明:本演算法中的排序演算法,可用上一篇排序演算法中的任一種演算法實現,如選擇排序、氣泡排序、快速排序等

測試環境:VC 6.0 (C)

[cpp] view plain copy  print?
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <time.h>
  4. #define MAX 101
  5. void input(int num[])  
  6. {  
  7.     int i;  
  8.     srand((unsigned)time(NULL));  
  9.     for(i=1; i<MAX; i++)  
  10.         num[i]=rand()%100;  
  11. }  
  12. void output(int num[])  
  13. {  
  14.     int i;  
  15.     for(i=1; i<MAX; i++)  
  16.     {  
  17.         printf("%5d", num[i]);  
  18.         if(0==i%10)  
  19.             printf("/n");  
  20.     }  
  21. }  
  22. void sort(int num[], int low, int high) /* quick sort */
  23. {  
  24.     int l, h;  
  25.     if(low<high)  
  26.     {  
  27.         l=low;  
  28.         h=high;  
  29.         num[0]=num[l]; /* save pivot */
  30.         while(l<h)  
  31.         {  
  32.             while(l<h && num[h]>=num[0]) h--;  
  33.                 num[l]=num[h];  
  34.             while(l<h && num[l]<=num[0]) l++;  
  35.                 num[h]=num[l];  
  36.         }  
  37.         num[l]=num[0]; /* insert pivot */
  38.         sort(num, low, l-1);  
  39.         sort(num, l+1, high);  
  40.     }  
  41. }  
  42. int find(int num[], int x, int low, int high)  
  43. {  
  44.     int mid;  
  45.     while(low<=high)  
  46.     {  
  47.         mid=(low+high)/2; /* find is OK */
  48.         if(x==num[mid])  
  49.             return mid;  
  50.         elseif(x<num[mid])  
  51.             high=mid-1;  
  52.         else
  53.             low=mid+1;  
  54.     }  
  55.     return 0;  
  56. }  
  57. void main()  
  58. {  
  59.     int x, pos, num[MAX];  
  60.     input(num);  
  61.     printf("sort before... /n");  
  62.     output(num);  
  63.     sort(num, 1, MAX-1);  
  64.     printf("sort after... /n");  
  65.     output(num);  
  66.     printf("Enter find num: ");  
  67.     scanf("%d", &x);  
  68.     pos=find(num, x, 1, MAX-1);  
  69.     if(pos)  
  70.         printf("OK! %d is found in pos: %d/n", x, pos);  
  71.     else
  72.         printf("Sorry! %d is not found... in num/n", x);  
  73. }  

執行結果: