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