- 首先要把一系列数组均匀分成若干块(最后一个可以不均匀)
每块中元素任意排列,即块中数字无序,但是整个块之间要有序。因此也存在局限性。
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的分组情况决定了在查找时的范围。