- 首先要把一系列數組均勻分成若干塊(最后一個可以不均勻)
每塊中元素任意排列,即塊中數字無序,但是整個塊之間要有序。因此也存在局限性。
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:\n "); 12 scanf("%d",&iLength); 13 printf("please enter the number:\n"); 14 for(i=0;i<iLength;i++) 15 { 16 scanf("%d",&a[i]); 17 } 18 printf("please enter the number that you want:\n"); 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.\n"); 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:\n"); 49 scanf("%d",&iStars); 50 51 j=block(iStars,a); 52 if(j==0) 53 printf("Failed\n"); 54 else 55 printf("success. the number on %d\n",j); 56 }
但是有個疑問,為什么在for循環中i的上限可以不限定。后來經過研究發現,如果i是2的話,則運用分塊查找法數列前排的可以找到,則數據后面的就發現不了,因此,i的分組情況決定了在查找時的范圍。
