zoukankan      html  css  js  c++  java
  • 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的分组情况决定了在查找时的范围。

  • 相关阅读:
    基础网络技术--学习网络的的道路漫长啊
    华为nova8se和vivoS7e的区别哪个好
    Java.awt实现一个简单的围棋
    HashMap put原理详解(基于jdk1.8)
    Paper Pal:一个中英文论文及其代码大数据搜索平台
    【u116】最短路计数
    【u108】取数游戏
    【u106】3D模型
    【topcoder SRM 652 DIV2 250】ValueOfString
    【u103】绘制二叉树
  • 原文地址:https://www.cnblogs.com/xiaochige/p/5953426.html
Copyright © 2011-2022 走看看