查找

顺序查找和二分查找

#define _CRT_SECURE_NO_WARNINGS
#include<bits/stdc++.h>
using namespace std;

typedef struct SS{
    int* elem;
    int TableLen;
}SSTable;
//初始化
void ST_Init(SSTable& ST, int len)
{
    ST.TableLen = len + 1;//多申请了一个位置,为了存哨兵
    ST.elem = (int*)malloc(sizeof(int) * ST.TableLen);
    int i;
    srand(time(NULL));//随机数生成
    for (i = 0; i < ST.TableLen; i++)//为啥这里零号位置也随机了数据,为折半查找服务
    {
        ST.elem[i] = rand() % 100;
    }
}
//打印
void ST_print(SSTable ST)
{
    for (int i = 0; i < ST.TableLen; i++)
    {
        printf("%3d", ST.elem[i]);
    }
    printf("\n");
}
//顺序查找
int Search_Seq(SSTable ST, int key) {
    //哨兵
    ST.elem[0] = key;
    int i;
    for (i=ST.TableLen -1; ST.elem[i] != key; --i);

    return i;
}
//二分查找
int Binary_Search(SSTable ST, int key) {
    int low = 0, high = ST.TableLen - 1, mid;
    while (low <= high) {
        mid = (low + high) / 2;
        if (ST.elem[mid] == key) {
            return mid;
        }
        else if (ST.elem[mid] < key) {
            low = mid + 1;
        }
        else if (ST.elem[mid] > key) {
            high = mid - 1;
        }
    }
    return -1;
}
int compare(const void* left, const void* right)
{
    return *(int*)left - *(int*)right;
}
int main() {
    SSTable ST;
    int key;
    int pos;//存储查询元素的位置
    ST_Init(ST, 10);
    ST_print(ST);
    printf("请输入要搜索的key值:\n");
    scanf("%d", &key);
    pos = Search_Seq(ST, key);
    if (pos)
    {
        printf("查找成功 位置为 %d\n", pos);
    }
    else {
        printf("查找失败\n");
    }

    qsort(ST.elem, ST.TableLen, sizeof(int), compare);//qsort实现的是快排

    ST_print(ST);
    printf("二分查找,请输入要搜索的key值:\n");
    scanf("%d", &key);
    //有序数组
    pos = Binary_Search(ST, key);
    if (pos != -1)
    {
        printf("查找成功 位置为 %d\n", pos);
    }
    else {
        printf("查找失败\n");
    }
    return 0;
}
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容