查找(1)

1、顺序查找

#include <stdio.h>
#define MAXSIZE 20

typedef struct{
    int key;
    int otherData;
}SeqList;

int search(SeqList sl[],int n,int x){
    for(int i=0;i<n;i++){
        if(sl[i].key == x){
            return i;
        }
    }
    return -1;
}

int main(){
    int n,x,temp;
    SeqList sl[MAXSIZE];
    printf("请输入元素的个数!\n");
    scanf("%d",&n);
    for(int t=0;t<n;t++){
        sl[t].otherData = 0;
    }
    printf("请输入所有的元素!\n");
    for(int i=0;i<n;i++){
        scanf("%d",&sl[i].key);
    }
    printf("列表中的元素是:\n");
    for(int j=0;j<n;j++){
        printf("%d  ",sl[j].key);
    }
    printf("\n");
    printf("请输入要查找的元素!(-1结束)\n");
    scanf("%d",&x);
    while(x != -1){
        temp = search(sl,n,x);
        if(temp == -1){
            printf("没有该元素!\n");
        }else{
            printf("元素%d是列表中的第%d个元素。\n",x,temp+1);
        }
        printf("请输入要查找的元素!(-1结束)\n");
        scanf("%d",&x);
    }
    return 0;
}

2、折半查找(二分查找)

#include <stdio.h>
#define MAXSIZE 20

typedef struct{
    int key;
    int otherData;
}SeqList;

SeqList temp;

void sort(SeqList sl[],int n){
    for(int i=0;i<n-1;i++){
        for(int j=0;j<n-i-1;j++){
            if(sl[j].key > sl[j+1].key){
                temp = sl[j];
                sl[j] = sl[j+1];
                sl[j+1] = temp;
            }
        }
    }
}

int binSearch(SeqList sl[],int n,int x){
    int low = 0;
    int high = n-1;
    int mid;
    while(low <= high){
        mid = (low + high)/2;
        if(sl[mid].key == x){
            return mid;
        }else if(sl[mid].key < x){
            low = mid+1;
        }else{
            high = mid-1;
        }
    }
    return -1;
}

int main(){
    int n,x,temp;
    SeqList sl[MAXSIZE];
    printf("请输入元素的个数!\n");
    scanf("%d",&n);
    for(int t=0;t<n;t++){
        sl[t].otherData = 0;
    }
    printf("请输入所有的元素!\n");
    for(int i=0;i<n;i++){
        scanf("%d",&sl[i].key);
    }
    printf("列表中的元素是:\n");
    for(int j=0;j<n;j++){
        printf("%d  ",sl[j].key);
    }
    printf("\n");
    printf("对列表中的元素排序之后输出的结果是:\n");
    sort(sl,n);
    for(int k=0;k<n;k++){
        printf("%d  ",sl[k].key);
    }
    printf("\n");
    printf("请输入要查找的元素!(-1结束)\n");
    scanf("%d",&x);
    while(x != -1){
        temp = binSearch(sl,n,x);
        if(temp == -1){
            printf("没有该元素!\n");
        }else{
            printf("元素%d是列表中的第%d个元素。\n",x,temp+1);
        }
        printf("请输入要查找的元素!(-1结束)\n");
        scanf("%d",&x);
    }
    return 0;
}

3、分块查找

#include <stdio.h>

typedef struct{
    int key;
    int otherData;
}SeqList;

typedef struct{
    int maxKey;
    int index;
}IndexList;

int search(SeqList sl[],int x,int total,IndexList il[],int n){
    int low = 0;
    int high = n-1;
    int mid;
    int i,j;
    while(low <= high){
        mid = (low + high)/2;
        if(il[mid].maxKey >= x){
            high = mid - 1;
        }else{
            low = mid + 1;
        }
    }
    if(low < n && low+1 != n){          //在这里要考虑low == 3的情况,当low等于3的时候low+1越界,所以low+1=n的情况需要单独判断
        i = il[low].index;
        j = il[low+1].index-1;
        while(i <= j && sl[i].key != x){
            i++;
        }
        if(i <= j){
            return i;
        }
    }else if(low+1 == n){
        i = il[low].index;
        while(sl[i].key != x && i<total){
            i++;
        }
        if(i<total){
            return i;
        }
    }
    return -1;
}

int main(){
    int x,temp;
    SeqList sl[] = {19,0,7,0,11,0,12,0,23,0,33,0,22,0,40,0,21,0,63,0,74,0,79,0,92,0,80,0,83,0,94,0};
    IndexList il[] = {19,0,40,4,79,9,94,12};
    printf("请输入要查找数据!\n");
    scanf("%d",&x);
    while(x != -1){
        temp = search(sl,x,16,il,4);
        if(temp == -1){
            printf("没有该元素!\n");
        }else{
            printf("元素%d是列表中的第%d个元素。\n",x,temp+1);
        }
        printf("请输入要查找数据!\n");
        scanf("%d",&x);
    }
    return 0;
}

对于一组非递增或递减的数据,使用第一种顺序查找的方式;对于递增或递减的一组数据使用折半查找的方式效率更高,查找的次数更少;而第三种分块查找虽然在小范围内可以没有顺序,但是大的方向上依然是有顺序的,而且还需要额外的建立一张索引表。所以在选择查找方式的时候要根据数据具体地情况而定。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值