王道C语言C++版查找算法总结

1. 顺序查找

顺序查找
//顺序查找
int Search_Seq(int A[],int n,int key){
    int i;
    A[0]=key;
    /*
    for (i = 1; ; i++)
        if (A[i] == key)
            break;
    if (i < n)
        return i;
    else
        return -1;
        */
    for(i=n;A[i]!=key;--i)
    {

    }
    return i;

}
int main(){
int a[11],i,key,k;    
printf("请输入10个数据:\n");
for (i =1;i<=10;i++)
    scanf("%d",&a[i]);    
printf("原始顺序:\n");
for(i=1;i<11;i++)
    printf("%5d",a[i]);    
//将未排序前的顺序输出
HeapSort(a,10);
 printf("\n 插入数据排序后顺序:\n");
for(i=1;i<11;i++)
    printf("%5d",a[i]); //将排序后的数组输出
printf("\n");
printf("请输入您想查找的元素:\n");
scanf("%d",&key);
//顺序查找
 k= Search_Seq(a,10,key);
 printf("查找出来的位置是%d\n",k);

}

2. 折半查找

折半查找
//折半查找
int Binary_Search(int a[],int n,int key){
int low,high,mid;
low=1;high=n;
//由于我的表从a[1]开始才有数据,所以下角标为此
//若从a[0]存储就是low=-1;high=n-1;
while(low<=high){
    mid=(low+high)/2;
    if(a[mid]==key)
        return mid;
    else if(a[mid]>key)
        high=mid-1;
    else
        low=mid+1;
}return -1;}

int main(){
int a[11],i,key,k;    
printf("请输入10个数据:\n");
for (i =1;i<=10;i++)
    scanf("%d",&a[i]);    
printf("原始顺序:\n");
for(i=1;i<11;i++)
    printf("%5d",a[i]);    
//将未排序前的顺序输出
HeapSort(a,10);
 printf("\n 插入数据排序后顺序:\n");
for(i=1;i<11;i++)
    printf("%5d",a[i]); //将排序后的数组输出
printf("\n");
printf("请输入您想查找的元素:\n");
scanf("%d",&key);
//二分查找
k=Binary_Search(a,10,key);
 printf("查找出来的位置是%d\n",k);}

3. 分块查找

分块查找
//自定义函数block_search,实现分块查找
struct index{
    int key;
    int start;
    int end;
}index_table[4];
int block_search(int key,int a[]){
    int i,j;
    i=1;
    while(i<=3&&key>index_table[i].key)//确定在哪个块中
        i++;
    if(i>3)//大于分得的块数,则返回0
        return 0;
    j=index_table[i].start;//j等于块范围的起始值
    while(j<=index_table[i].end&&a[j]!=key)
        j++;
    if(j>index_table[i].end)
        j=0;
    return j;
}


int main(){
//分块查找数据
int i,j=0,k,key,a[16];
printf("请输入15个数:\n");
for(i=1;i<16;i++)
    scanf("%d",&a[i]);
for(i=1;i<=3;i++){
    index_table[i].start=j+1;
    j=j+1;
    index_table[i].end=j+4;
    index_table[i].key=a[j];
}
printf("请输入您想查找的元素:\n");
scanf("%d",&key);
k=block_search(key,a);
if(k!=0)
    printf("查找成功,其位置是:%d\n",k);
else
    printf("查找失败!");
return 0;


}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值