冒泡排序、折半查找法

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

折半查找的原理:

1.折半查找法是一种在有序数组中查找某一特定元素的搜索算法(若无序需先将其排序)  

2.首先确定好左(left)、中(mid)、右(right)3个位置,一般情况下中间位置mid=(left+right)/2但如果查找的范围非常庞大,left+right的数值会超过程序所承受的范围,导致数据的溢出泄露这时我们可以采取平均划分的办法来进行运算,对其数值较大的一方减去最小的一方得到他们之间所相差数,将相差数进行平均划分给2方,从而就可以得到相应的中间数mid=left+(right-left)/2  

3.方法步骤:(1)搜索过程中从中间开始查找,若中间元素刚好等于所要查找的数则查找结束  (2)若中间元素小于所要查找的元素,则查找元素存在于中间元素的右边,可将左侧数据进行排除,并重新确定left的位置,left则取新区间最左侧的位置,即:left=mid+1  (3)若中间元素大于所要查找的元素,则查找元素存在于中间元素的左边,可将右侧数据进行排除,并重新确定right的位置,left则取新区间最右侧的位置,既:right=mid-1  (4)若left>right,则数据中并没有所要查找的数据

4.优点:比较次数较少,查找速度快,平均性能好。缺点:查找数据必须在有序数组中才能进行,且插入删除困难。   5.因此折半查找法适用于不经常变动而查找频繁的有序数组。

代码实现:

#include 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(ka[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 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;

你可能感兴趣的:(排序算法,算法)