C语言实现冒泡法排序和折半查找 c语言先排序后折半查找程序的实验报告

作者&投稿:淳贪 (若有异议请与网页底部的电邮联系)
#include<stdio.h>
#include<string.h>
void main()
{
char name[10][9]={"华","英","萍","涛","丽","强","军","斌","伟","亚"};
int score[10]={75,87,68,92,88,61,77,96,80,72};
printf("排序结果:\n");
for(int i=0;i<10;i++)//冒泡排序
for(int j=i+1;j<10;j++)
{
if(score[i]<score[j])
{
int temp=score[i];
score[i]=score[j];
score[j]=temp;
char temp1[9];
strcpy(temp1,name[i]);
strcpy(name[i],name[j]);
strcpy(name[j],temp1);
}
}
for(i=0;i<10;i++)//输出排序后的结果
{
printf("%s %d\n",name[i],score[i]);
}
i=0;
int j=10;
int t=72;//这是给定的一个成绩,查此成绩的人的名字,找不到输出找不到的信息。
printf("\n查询结果:\n");
while (i<j)//i==j表明t只有可能是数组a的第i个元素
{
if (t>=score[(i+j)/2]) j=(i+j)/2;//此时t在第i个到第(i+j)/2个元素的范围内
else i=(i+j)/2+1;//此时t在第(i+j)/2+1个到第j个元素的范围内
}
if (score[i]!=t) printf("No such element!\n");//没找到
else printf("%s score:%d\n",name[i],score[i]);//找到了
}

#include <stdio.h>
#include <string.h>

#define NUM 10

int BinSearch(int a[], int s, int k)
{
int low = 0;
int high = s - 1;

while (low <= high)
{
int mid = (low + high) / 2;

if (k == a[mid])
{
return mid;
}
else
{
if (k < a[mid])
high = mid - 1;
else
low = mid + 1;
}
}

return -1;
}

void main()
{
char names[NUM][5] = { "华", "英", "萍", "涛", "丽", "强", "军", "斌", "伟", "亚" };
int scores[NUM] = {75, 87, 68, 92, 88, 61, 77, 96, 80, 72};
char nm[5];
int i, j, t;

for (i = 0; i < NUM; i++)
{
for (j = 0; j < NUM - 1; j++)
{
if (scores[j] > scores[j + 1])
{
t = scores[j];
scores[j] = scores[j+1];
scores[j+1] = t;

strcpy(nm, names[j]);
strcpy(names[j], names[j+1]);
strcpy(names[j+1], nm);
}
}
}

strcpy(nm, "曾亚");
t = BinSearch(scores, 10, 72);

if (t >= 0)
printf("%s成绩是%d\n", nm, scores[t]);

putchar('\n');
}

#include<stdio.h>

struct student{
int score;
char *name;
}stu[10]={ {75,"hua"},{87,"ying"},{68,"ping"},{92,"tao"},{88,"li"},{61,"qiang"},{77,"jun"},{96,"bing"},{72,"ya"} };

maopao()
{int flag,i,j,t;
char *temp;
for(i=0;i<9;i++)
{flag=0;
for(j=0;j<10-i-1;j++)
if(stu[j].score>stu[j+1].score) {t=stu[j].score;stu[j].score=stu[j+1].score;stu[j+1].score=t;
temp=stu[j].name;stu[j].name=stu[j+1].name;stu[j+1].name=temp;
flag=1;
}
if(flag==0) break;
}
}

half_search(int *place,int num)
{int mid,low=0,high=9;
do{
mid=(low+high)/2;
if(num==stu[mid].score) *place=mid;
else if(num<stu[mid].score) high=mid-1;
else low=mid+1;
}while(num!=stu[mid].score);
}

void main()
{
int i,p,find_num=72;
printf("\nscores:");
for(i=0;i<10;i++)
printf("%5d",stu[i].score);
maopao();
printf("\nnew score order:");
for(i=0;i<10;i++)
printf("%5d",stu[i].score);
half_search(&p,find_num);
printf("\nya's score location:%d and stu[p].score=%d",p,stu[p].score);
}

用tc调试通过了的

#include<stdio.h>
#include<string.h>
void
main()
{
char
name[10][9]={"华","英","萍","涛","丽","强","军","斌","伟","亚"};
int
score[10]={75,87,68,92,88,61,77,96,80,72};
printf("排序结果:\n");
for(int
i=0;i<10;i++)//冒泡排序
for(int
j=i+1;j<10;j++)
{
if(score[i]<score[j])
{
int
temp=score[i];
score[i]=score[j];
score[j]=temp;
char
temp1[9];
strcpy(temp1,name[i]);
strcpy(name[i],name[j]);
strcpy(name[j],temp1);
}
}
for(i=0;i<10;i++)//输出排序后的结果
{
printf("%s
%d\n",name[i],score[i]);
}
i=0;
int
j=10;
int
t=72;//这是给定的一个成绩,查此成绩的人的名字,找不到输出找不到的信息。
printf("\n查询结果:\n");
while
(i<j)//i==j表明t只有可能是数组a的第i个元素
{
if
(t>=score[(i+j)/2])
j=(i+j)/2;//此时t在第i个到第(i+j)/2个元素的范围内
else
i=(i+j)/2+1;//此时t在第(i+j)/2+1个到第j个元素的范围内
}
if
(score[i]!=t)
printf("No
such
element!\n");//没找到
else
printf("%s
score:%d\n",name[i],score[i]);//找到了
}

关于C语言的折半查找的代码,先排序后折半查找。~

#include
#define N 10
int main()
{
int a[N],num,index,flag=0;
int i,j,t;
int low=0,high=N-2,mid;
printf("请输入%d个数:
",N);
for(i=0;i<N;i++)
scanf("%d",&a[i]);
printf("
");
for (j=0;j<9;j++)
for (i=0;i<9-j;i++)
if (a[i]>a[i+1])
{
t=a[i];
a[i]=a[i+1];
a[i+1]=t;
}
printf("这些数由大到小的顺序是:");
for (i=0;i<10;i++)
printf("%d ",a[i]);
printf("

");
printf("请输入要查找的数:
");
scanf("%d",&num);
if(num==a[N-1])
printf("你要找的数是第%d项。",N);
else
while (low<high)
{
if(num==a[high])
{
flag=1;
index=high+1;
break;}
if(num==a[low])
{
flag=1;
index=low+1;
break;}
mid=(low+high)/2;
if (num==a[mid]+1)
{
flag=1;
index=mid+2;
break;
}
else
{
if (num>mid)
low=mid;
else
high=mid;
}
}
if (flag==1)
printf("你要找的数是第%d项。",index);
else
printf("你要找的数不在该数组中。");
return 0;
}


给别人看程序比自己写慢多了。。。。。。
首先有没包含进去的情况。。你的程序加起来是奇数,会舍去一,结果很乱
还有就是没有加break;程序当然不会停了。。。

1实验目的:熟练掌握一维数组,二维数组的定义,初始化和输入输出方法;熟练掌握与数组有关的常用算法(如查找,排序等)。
2实验内容:设定一个整形数组存放20个元素,用直接赋值的方法在程序中初始化该数组。先对这些无序的数据进行排序,然后采用折半查找,把要寻找的数的位置输出出来。
3算法描述流程图




源程序:#include
void main()
{int k,s,b,i,j,m,n,a[20]={12,9,16,21,6,11,19,4,8,20,15,2,5,18,14,7,3,10,13,17};
for(s=0;s<20;s++)
{
for(i=s+1;i<20;i++)
{
if(a[s]>a[i])
{
j=a[s];
a[s]=a[i];
a[i]=j;
}
}
}
scanf("%d",&b);
m=0;
n=19;
while(m<=n)
{
k=(m+n)/2;
if(b==a[k])
{
printf("FOUND
");
printf("%d
",k+1);
break;
}
else
{
if(b<a[k])
n=k-1;
else
m=k+1;
}
if(m>n)
printf("NO FOUND");
}
}

5测试数据:3,5, 20,30

6运行结果:FOUND 2;FOUND 4;FOUND 19 ;NO FOUND

7出现问题及解决方法:编译时出错,修改源程序,直到没有错误为止

8实验心得:通过折半查找,可以实现对数组数据的处理,并且增加了查找速度

C语言简单冒泡法程序
答:1、打开Visual stdio软件,在空项目里新建一个c语言程序空文件:2、弹出的窗口选择C++文件,将文件扩展名改为“.c”点击添加完成新建c文件,之后就可以编写程序了:3、这里从数组头部开始,不断比较相邻的两个元素的大小,让较大的元素逐渐往后移动(交换两个元素的值),直到数组的末尾,经过一轮的...

C语言冒泡排序法是什么?
答:冒泡排序法,是C语言常用的排序算法之一,意思是对一组数字进行从大到小或者从小到大排序的一种算法。具体方法是:相邻数值两两交换。从第一个数值开始,如果相邻两个数的排列顺序与我们的期望不同,则将两个数的位置进行交换(对调);如果其与我们的期望一致,则不用交换。重复这样的过程,一直到...

C语言冒泡排序法代码是什么?
答:所谓冒泡排序法,就是对一组数字进行从大到小或者从小到大排序的一种算法。1、具体方法是,相邻数值两两交换。从第一个数值开始,如果相邻两个数的排列顺序与我们的期望不同,则将两个数的位置进行交换(对调);如果其与我们的期望一致,则不用交换。重复这样的过程,一直到最后没有数值需要交换,则...

用C语言编写顺序查找和二分查找(折半查找)
答:二分查找又称折半查找,它是一种效率较高的查找方法。【二分查找要求】:1.必须采用顺序存储结构 2.必须按关键字大小有序排列。【优缺点】折半查找法的优点是比较次数少,查找速度快,平均性能好;其缺点是要求待查表为有序表,且插入删除困难。因此,折半查找方法适用于不经常变动而查找频繁的有序...

...用“冒泡法”对输入的10个字符按由小到大顺序排列
答:冒泡排序需要用到两层循环,第一层循环遍历数组中的元素,第二层则进行两两比较,如果顺序不对就要对其进行换位,直到排序完成:4、最后执行程序观察结果,按下crtl+F5弹出程序,随意输入10个数,按下回车键执行结果,此时就可以看到排序后的结果了。以上就是c语言冒泡排序程序的演示:...

C语言冒泡排序法
答:冒泡排序每一趟排序把最大的放在最右边。比如:87 12 56 45 78 87和12交换:12 87 56 45 78 87和56交换: 56 87 45 78 87和45交换: 45 87 78 87和78交换: 78 87 到此第一趟排序结束,接下来的每一趟排序都是这样。include<stdio.h>void Print(int *num, int n){ int...

求关于c语言 冒泡排序法的讲解
答:冒泡排序法是简单的排序方法之一,它和气泡从水中往上冒的情况有 些类似。其具体做法是 (1)对于数组a中的1至n个数据,先将第n个和第n-1个数据进行比较,如果 a(n)

C语言冒泡排序法是怎么排序的?
答:C语言冒泡排序法的排序规则:将被排序的记录数组R[1..n]垂直排列,每个记录R看作是重量为R.key的气泡。根据轻气泡不能在重气泡之下的原则,从下往上扫描数组R:凡扫描到违反本原则的轻气泡,就使其向上"飘浮"。如此反复进行,直到最后任何两个气泡都是轻者在上,重者在下为止。初始 R[1..n]为...

...使用冒泡法对这10个数进行排序。要求使用指针实现。
答:voidBubbleSort(inta[],intn){ int i,j,temp,flag=1;for(i=0;i<n-1&&flag;i++)//比较的趟数 { flag=0;//未进行比较,将flag置0 for(j=0;j<n-1-i;j++)//每趟比较的次数 if(a[j]>a[j+1])//由小到大排序 { temp=a[j];a...

如何用冒泡法对10个输入数据排序?
答:采用冒泡法降序排列10个输入数据的程序如下:先定义一个长度为10的数组a[],10个数据由键盘输入,从第一个数开始,两两一组进行判断,因为要求是降序排列,因此将两个数中小的向后移动,每个数要比较的次数为9-数的下标。比较完成后将数组依次输出。输入10个数据,程序运行结果:...