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");
}