冒泡排序和拆半查找

冒泡排序的原理是:从左到右,相邻元素进行比较。每次比较一轮,就会找到序列中最大的一个或最小的一个。这个数就会从序列的最右边冒出来。以从小到大排序为例,第一轮比较后,所有数中最大的那个数就会浮到最右边;第二轮比较后,所有数中第二大的那个数就会浮到倒数第二个位置……就这样一轮一轮地比较,最后实现从小到大排序。

折半查找的原理:1.折半查找法是一种在有序数组中查找某一特定元素的搜索算法(若无序需先将其排序)   2.首先确定好左(left)、中(mid)、右(right)3个位置,一般情况下中间位置mid=(left+right)/2但如果查找的范围非常庞大,left+right的数值会超过程序所承受的范围,导致数据的溢出泄露\n\n这时我们可以采取平均划分的办法来进行运算,对其数值较大的一方减去最小的一方\n\n得到他们之间所相差数,将相差数进行平均划分给2方,从而就可以得到相应的中间数\n\nmid=left+(right-left)/2   3.方法步骤\n\n(1)搜索过程中从中间开始查找,若中间元素刚好等于所要查找的数则查找结束\n\n(2)若中间元素小于所要查找的元素,则查找元素存在于中间元素的右边,可将左侧数据进行排除,并重新确定left的位置,left则取新区间最左侧的位置,即:left=mid+1\n\n(3)若中间元素大于所要查找的元素,则查找元素存在于中间元素的左边,可将右侧数据进行排除,并重新确定right的位置,left则取新区间最右侧的位置,既:right=mid-1\n\n(4)若left>right,则数据中并没有所要查找的数据    4.优点:比较次数较少,查找速度快,平均性能好\n\n缺点:查找数据必须在有序数组中才能进行,且插入删除困难\n\n5.因此折半查找法适用于不经常变动而查找频繁的有序数组。

代码实现:
#include<stdio.h>
 void zb(int k,int a[],int n)//其中k表示要找的数,a表示数组,n表示数组元素个数 
 {
 	int i,high,low,mid;
 	int c1=0,c=0;
 	low=0;
 	high=n;
 	while(high>=low)
 	{	
		c++;
		mid=(high+low)/2; 
 		if(k<a[mid])//说明k在a【mid】的左半边 ,那么最右边的high下标就可以在下标mid基础上往左进一个单位
		high=mid-1;
 		else if(k>a[mid])//说明k在a【mid】的右半边 ,那么最左边的low下标就可以在下标mid基础上往右进一个单位
 		low=mid+1;
		if(k==a[mid])
		{
			printf("元素找到了!一共查找了%d次,它处于a[%d]位置上a[%d]=%d\n",c,mid,mid,k);
			c1++;
			break;
		}
	}
	 if(c1==0)
	 printf("该元素不存在!\n");
 }
 int main ()
 {
 	int k,n,a[100];
 	int i;
 	void zb(int k,int a[],int n);//声明定义函数 
 	printf("请输入数组元素个数:\n");
 	scanf("%d",&n);
 	printf("请输入数组元素:\n");
 	for(i=0;i<n;i++)//通过for循环将数组的元素从键盘上获取。
 	{
 		scanf("%d",&a[i]);
	 }
	int j, temp;
	//将从键盘上获取到的数进行从小到大的排序。
	for (i = 1; i <= n; i++)//外层循环是比较的轮数,数组内有n个数,那么就应该比较n-1轮
	{
		for (j = 0; j <= n - i; j++)//内层循环比较的是当前一轮的比较次数,例如:第一轮比较n-1次,第二轮比较n-2次
		{
			if (a[j] > a[j + 1])//相邻两个数如果逆序,则交换位置
			{
				temp = a[j];
				a[j] = a[j + 1];
				a[j + 1] = temp;
			}
		}
	}
	printf("排序过后的数顺序:\n");
	for (i = 1; i <= n; i++)
	printf("%-4d", a[i]);
	printf("\n");
	 printf("请输入要查找的数:\n");
	 scanf("%d",&k);
	 zb(k,a,n);
	 printf("\n");
	 return 0;

764dc64274344ac69976c3c31b373315.png

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

​‍⁠‌​‍桃花岛-奈何

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值