c语言完成分块查找

  • 首先要把一系列数组均匀分成若干块(最后一个可以不均匀)

    每块中元素任意排列,即块中数字无序,但是整个块之间要有序。因此也存在局限性。


 1 #include<stdio.h>
 2 
 3 //分块查找法
 4 void black(int b[],int iLong,int key);//分块算法
 5 int max(int a[],int start,int end);//寻求数组中的最大值,并返回。
 6 
 7 int main()
 8 {
 9     int iLength,istars,i,iTimes,iNumber,n;
10     int a[100];
11     printf("please enter the length of the array:
 ");
12     scanf("%d",&iLength);
13     printf("please enter the number:
");
14     for(i=0;i<iLength;i++)
15     {
16         scanf("%d",&a[i]);
17     }
18     printf("please enter the number that you want:
");
19     scanf("%d",&istars);
20     
21 
22 
23 }
24 int max(int a[],int start,int end)//寻求数组中的最大值,并返回。
25 {
26     int i,iTemp;
27     for(i=start;i<end;i++)
28     {
29         if(a[i]>a[i+1])
30         {
31             iTemp=a[i];
32             a[i]=a[i+1];
33             a[i+1]=iTemp;
34         }
35     }
36     return a[end];
37 }
38 
39 
40 void black(int b[],int iLong,int key)
41 {
42     int a,b,c;
43     a=2;
44     
45     
46 }

自己首先写了如上的代码,但是这种写法发现在写分块查找模块时,越写越难找,越来越难找。所以,这种思路过于复杂。

 又由于分块查找法需要分块处理,则需要结构体来实现分块查找,

但是,分块查找法要求每个块之间有序,这就很大的局限性,前一个块的最大值必须比后一个块的最小值小。因此暂定输入整个数组皆为有序。

 1 #include <stdio.h>
 2 
 3 struct number//结构体,定义每个分块中的数据结构,且每个分块的数据结构能相同
 4 {
 5     int start;
 6     int end;
 7     int key;
 8 }number_table[4];//结构体中这个分号一定要有。
 9 
10 int block(int key,int a[])
11 {
12     int i,j;
13     i=0;
14     while( key>number_table[i].key  &&  i<4)//确定为哪个分的块中
15         i++;
16     if(i>4)
17         return 0;
18     j=number_table[i].start; //设置j为每个块中的首数据。
19     while(key!=j && j<number_table[i].end)//在块中的什么位置。此时不能具体化为4.因为分块法最后一组不一定为4个
20     {
21         j++;
22     }
23     if(j>number_table[i].end)
24         j=0;
25     return j;
26 }
27 int main()
28 {
29     int i,j,k;
30     int iStars;
31 
32     int a[17];
33     j=0;
34     printf("please enter fifth numbers.
");
35     for(i=1;i<=16;i++)
36     {
37         scanf("%d",&a[i]);
38     }
39     //这个循环刚开始没写。
40     for(i=1;i<=2;i++)//i的上限表示分组情况,但有个疑问为什么上限为2的时候依旧正确呢
41     {
42         number_table[i].start=j+1;//第一次循环 开始的下标为1     2循环,开始的下标为6
43         j++;
44         number_table[i].end=j+5;//第一次循环 结尾的下标为5 
45         j=j+5;
46         number_table[i].key=a[j];//限定了最大值为最后一位 为a[5].
47     }
48     printf("please enter the number that you want:
");
49     scanf("%d",&iStars);
50 
51     j=block(iStars,a);
52     if(j==0)
53         printf("Failed
");
54     else
55         printf("success. the number on %d
",j);
56 }

但是有个疑问,为什么在for循环中i的上限可以不限定。后来经过研究发现,如果i是2的话,则运用分块查找法数列前排的可以找到,则数据后面的就发现不了,因此,i的分组情况决定了在查找时的范围。

原文地址:https://www.cnblogs.com/xiaochige/p/5953426.html