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:\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的分組情況決定了在查找時的范圍。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM