#include<stdio.h> #include<conio.h> #define N 10 int E[N]={213,111,222,77,400,300,987,1034,632,555}; void ss_sort(int e[],int n) { int i,j,k,t; for(i=0;i<n-1;i++) { for(k=i,j=i+1;j<n;j++) if(e[k]>e[j]) k=j; if(k!=i) { t=e[i]; e[i]=e[k]; e[k]=t; } } } int search1(int *k,int n,int key) { int i; for(i=0;i<n&&k[i]!=key;i++); return (i<n?i:-1); } int search2(int *k,int n,int key) { int i; for(i=0;i<n&&k[i]!=key;i++); if(i<n&&k[i]==key) return i; return -1; } int bin_search(int *k,int n,int key) { int low=0,high=n-1,mid; while(low<=high) { mid=(low+high)/2; if(key==k[mid]) return mid; if(key>k[mid]) high=mid-1; else low=mid+1; } return -1; } void main() { int i,j; int E[N]; printf("请输入需要进行查找的线性表(输入10个数字):\n"); for(i=0;i<N;i++) { scanf("%d",&E[i]); } printf("初始数据序列为:\n"); for(i=0;i<N;i++) printf("%d",E[i]); printf("请输入要查找的关键码"); printf("\n"); scanf("%d",&i); if((j=search1(E,N,i))>0) printf("找到关键码,位置为:%d\n",j+1); else printf("找不到\n"); getch(); ss_sort(E,N); printf("\n顺序排列后数据列表为:\n"); for(i=0;i<N;i++) printf("%d",E[i]); printf("\n\n输入要查找的关键码\n"); scanf("%d",&i); if((j=search2(E,N,i))>0) printf("找到关键码,位置为:%d\n",j+1); else printf("找不到\n"); getch(); printf("\n输入要查找的关键码"); scanf("%d",&i); if(j=bin_search(E,N,i)>0) printf("找到关键码,位置为:%d\n",j+1); else printf("找不到\n"); getch(); }
时间: 2023-12-07 13:04:30 浏览: 129
这是一个使用 C 语言实现的线性表查找和排序的程序。其中包括了三种不同的查找方法:顺序查找、折半查找以及改进的顺序查找。具体解释见注释:
```c
#include<stdio.h> //标准输入输出头文件
#include<conio.h> //控制台输入输出头文件
#define N 10 //定义线性表长度为10
int E[N]={213,111,222,77,400,300,987,1034,632,555}; //初始化线性表
//简单选择排序
void ss_sort(int e[],int n)
{
int i,j,k,t;
for(i=0;i<n-1;i++) //i从0开始到n-2,即倒数第二个元素
{
for(k=i,j=i+1;j<n;j++) //在i+1到n-1之间寻找最小值
if(e[k]>e[j])
k=j;
if(k!=i) //如果最小值不在i处,则交换
{
t=e[i];
e[i]=e[k];
e[k]=t;
}
}
}
//顺序查找
int search1(int *k,int n,int key)
{
int i;
for(i=0;i<n&&k[i]!=key;i++); //在线性表中查找key
return (i<n?i:-1); //如果找到,则返回下标i,否则返回-1
}
//改进的顺序查找
int search2(int *k,int n,int key)
{
int i;
for(i=0;i<n&&k[i]!=key;i++); //在线性表中查找key
if(i<n&&k[i]==key) //如果找到,则返回下标i
return i;
return -1; //否则返回-1
}
//折半查找
int bin_search(int *k,int n,int key)
{
int low=0,high=n-1,mid; //low、high分别指向线性表的第一个和最后一个元素,mid为中间位置
while(low<=high) //当low<=high时执行循环
{
mid=(low+high)/2; //计算中间位置
if(key==k[mid]) //如果中间元素等于key,返回下标mid
return mid;
if(key>k[mid]) //如果key大于中间元素,则在右半部分继续查找
high=mid-1;
else //否则,在左半部分继续查找
low=mid+1;
}
return -1; //如果没有找到,返回-1
}
void main() //程序入口
{
int i,j;
int E[N]; //定义线性表
printf("请输入需要进行查找的线性表(输入10个数字):\n");
for(i=0;i<N;i++)
{
scanf("%d",&E[i]); //输入线性表元素
}
printf("初始数据序列为:\n");
for(i=0;i<N;i++)
printf("%d",E[i]); //输出线性表元素
printf("请输入要查找的关键码");
printf("\n");
scanf("%d",&i);
if((j=search1(E,N,i))>0) //使用顺序查找查找关键码
printf("找到关键码,位置为:%d\n",j+1);
else
printf("找不到\n");
getch(); //等待用户按下任意键
ss_sort(E,N); //使用简单选择排序对线性表进行排序
printf("\n顺序排列后数据列表为:\n");
for(i=0;i<N;i++)
printf("%d",E[i]); //输出排序后的线性表
printf("\n\n输入要查找的关键码\n");
scanf("%d",&i);
if((j=search2(E,N,i))>0) //使用改进的顺序查找查找关键码
printf("找到关键码,位置为:%d\n",j+1);
else
printf("找不到\n");
getch(); //等待用户按下任意键
printf("\n输入要查找的关键码");
scanf("%d",&i);
if(j=bin_search(E,N,i)>0) //使用折半查找查找关键码
printf("找到关键码,位置为:%d\n",j+1);
else
printf("找不到\n");
getch(); //等待用户按下任意键
}
```
阅读全文