C/C++:各种基本算法实现小结(六)—— 查找算法

来源:互联网 发布:军用软件下载 编辑:程序博客网 时间:2024/06/05 02:29

各种基本算法实现小结(六)—— 查找算法

(均已测试通过)

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

 

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.       
  9.     srand((unsigned)time(NULL));  
  10.     for(i=1; i<MAX; i++)  
  11.         num[i]=rand()%100;  
  12. }  
  13. void output(int num[])  
  14. {  
  15.     int i;  
  16.       
  17.     for(i=1; i<MAX; i++)  
  18.     {  
  19.         printf("%5d", num[i]);  
  20.         if(0==i%10)  
  21.             printf("/n");  
  22.     }  
  23. }  
  24. int find(int num[], int x)  
  25. {  
  26.     int i;  
  27.     for(i=1; i<MAX; i++)  
  28.         if(x == num[i])  
  29.             return i;  
  30.     return 0;  
  31. }  
  32. void main()  
  33. {  
  34.     int x, pos, num[MAX];  
  35.     input(num);  
  36.       
  37.     printf("num...: /n");  
  38.     output(num);  
  39.       
  40.     printf("Enter find num: ");  
  41.     scanf("%d", &x);  
  42.     pos=find(num, x);  
  43.     if(pos)  
  44.         printf("OK! %d is found in pos: %d/n", x, pos);  
  45.     else  
  46.         printf("Sorry! %d is not found... in num/n", x);  
  47. }  

运行结果:

  

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

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

运行结果:

   

阅读全文
0 0
原创粉丝点击