顺序表折半查找

本文介绍如何使用直接插入排序算法对一维数组进行排序,并结合折半查找法寻找指定值在排序后的数组位置。通过实例演示了输入数组元素、查找过程和输出结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Description
创建一个一维数组,指定该一维数组的大小n,输入数组的n个元素,首先按指定算法(直接插入)对数组排序,输出排序结果,然后在排序的基础上,输入要查找的数值X,利用“折半法”查找其关键字等于X 的数据元素,若找到,则输出该元素在排序后表中的位置(1...n),否则为0,并输出查找次数。 

Input
第一行:输入一个整数n表示数组的长度(1<n<1000)
第二行:输入n个整数,整数之间用空格分隔
第三行:输入一个整数X为要查找的数值 

Output
第一行:输出n个排序后的整数,整数之间用空格分隔,注意:最后一个输出的整数后面没有空格!!!
第二行:输出1个整数,为该元素在排序后表中的位置,若查找失败,输出0
第三行:输出查找次数,若查找失败,输出0

Sample Input
8
47 98 23 55 66 77 99 65
55

Sample Output
23 47 55 65 66 77 98 99
3
3

//顺序表折半查找
#include <stdio.h>
#include <stdlib.h>
#define ListSize 100
typedef int ListData;
typedef struct
{
    ListData *data;
    int length;
}SeqList;
void InitList(SeqList &L)
{
    L.data=(ListData*)malloc(ListSize*sizeof(ListData));
    L.length=0;
}
void Insertsort(SeqList &L,int s)
{

    for(int i=1;i<=s;i++)
    {   L.data[0]=L.data[s];
        if(i==1&&L.data[1]>L.data[s])
        {
            for(int j=s-1;j>=1;j--)
            {
                L.data[j+1]=L.data[j];
            }
            L.data[1]=L.data[0];
        }
        else if (i!=1&&L.data[i-1]<=L.data[0]&&L.data[i]>=L.data[0])
        {
            for(int j=s-1;j>=i;j--)
            {
                L.data[j+1]=L.data[j];
            }
            L.data[i]=L.data[0];
        }
    }
}
void CreatList(SeqList &L)
{

    scanf("%d",&L.length);
    for(int i=1;i<=L.length;i++)
    {
         scanf("%d",&L.data[i]);
         Insertsort(L,i);
    }

}
int FindByValue(SeqList &L,ListData x)
{
    int i=0;
    while(i<=L.length&&L.data[i]!=x)
        i++;
    if(i<=L.length) return i;
    else return 0;
}
int search_Bin(SeqList L,int key)
{
 int low=1,high=L.length,mid,cnt=0;
 while(low<=high)
 {
  mid=(low+high)/2;
  cnt++;
  if(key==L.data[mid]) return cnt;
  else if(key<L.data[mid])  high=mid-1;
  else  low=mid+1;
 }
 return 0;
}
void ShowList(SeqList L)
{

    for(int i=1;i<L.length;i++)
        printf("%d ",L.data[i]);
    printf("%d\n",L.data[L.length]);
}
int main()
{

        SeqList L;
        InitList(L);
        CreatList(L);
        ShowList(L);
        int a;
        scanf("%d",&a);
        if(FindByValue(L,a))printf("%d\n",FindByValue(L,a));
        else printf("0\n");
        if(search_Bin(L,a))printf("%d",search_Bin(L,a));
        else printf("0");

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值