数据结构·练习·整数冒泡排序与折半查找
一、问题描述
对输入的一组整数进行升序排序,然后用折半查找法查找。
二、算法概述
1、问题分析
1)排序
2)查找
2、算法描述
- 遍历存储数组,每次比较相邻两个元素的值,将较小的数排在较大的数的前面;
- 将查找值和中间值比较,若查找值>中间值,则在右侧继续查找,若查找值<中间值,则在左侧继续查找,以此类推。
三、输入说明
一行输入一组整数,下一行输入查找值。
四、输出说明
一行输出升序整数列,并以“00”结尾,下一行升序输出查找值在数列中的位置,若未找到,输出“查找失败”。
输入样例:
5 7 2 8 1 6 9 3 5 00
5
输出样例:
1 2 3 5 5 6 7 8 9
3 4
五、程序实现
#include<stdio.h>
int main()
{
int i=1,j;
int a[100],local[100];
int len,temp,key,low=0,high,mid,light=0;
scanf("%d",&a[0]);
while(a[i-1]!=00)//输入
{
scanf("%d",&a[i]);
i++;
}
len=i-1;
high=len-1;
scanf("%d",&key);
/*升序排序*/
for(i=0;i<len;i++)//在待排区间操作
{
for(j=len-1;j>i;j--)//从最后一个元素开始操作
{
//j每循环一次,便有一个元素离开待排区,进入已排区
if(a[j]<a[j-1])//如果小,则交换前移
{
temp=a[j-1];
a[j-1]=a[j];
a[j]=temp;
}
}
}
//打印
for(i=0;i<len;i++)
{
printf("%d ",a[i]);
}
printf("\n");
//查找
while(low<=high)
{
mid=low+(high-low)/2;
if(key==a[mid])
{
local[light]=mid;
light=1;
//排查存在相同值的情况
for(i=mid-1;i>=0;i--)
{
if(a[i]==key)
{
local[light]=i;
light++;
}
else
{
break;
}
}
for(i=mid+1;i<len-mid;i++)
{
if(a[i]==key)
{
local[light]=i;
light++;
}
else
{
break;
}
}
break;
}
else if(key<a[mid])
{
high=mid-1;
}
else
{
low=mid+1;
}
}
if(light==0)
{
printf("查找失败");
}
//升序输出查找值位置
else
{
/*升序排序*/
for(i=0;i<light;i++)//在待排区间操作
{
for(j=light-1;j>i;j--)//从最后一个元素开始操作
{
//j每循环一次,便有一个元素离开待排区,进入已排区
if(local[j]<local[j-1])//如果小,则交换前移
{
temp=local[j-1];
local[j-1]=local[j];
local[j]=temp;
}
}
}
//打印
for(i=0;i<light;i++)
{
printf("%d ",local[i]);
}
}
return 0;
}
六、运行结果
七、实践总结
1、认知归纳
注意临界情况和细节。
2、实践问题
小细节的疏漏导致的bug很难找,真让人炸毛而不爽!!!虽说难以避免,我觉得更重要的是控制好心态,有条不紊地找bug。