要求使用折半法的关于数组的C语言编写

有一个已按降序排列的数组中,现输入一个任意整数,要求使用折半法,按原来排序的规律将它们插入数组中...假设原数组为a[10]={50.42.38.25.10.7.6.3.... 有一个已按降序排列的数组中,现输入一个任意整数,要求使用折半法,按原来排序的规律将它们插入数组中...
假设原数组为a[10]={50.42.38.25.10.7.6.3.0}

我要可以运行的完整的编写程序~

回答经采纳即追加分数~~
展开
 我来答
明月隐丹心
2008-01-01 · TA获得超过174个赞
知道答主
回答量:230
采纳率:0%
帮助的人:0
展开全部
#include <stdio.h>
#define N 10
int main(){
int i,a[20]={0};/*建个大小为20是保证足够大*/
int inputNum,temp1,temp2,temp;
for (i=0;i<N;i++) {
scanf("%d",&a[i]);
fflush(stdin);
}/*初始化输入你要的数据,fflush保证输入数据正确,每输入完一个数据回车*/
for(i=0;i<N;i++) printf(" %d ",a[i]);
printf("\n");
scanf("%d",&inputNum);
temp1=0;
temp2=N-1;
if(a[0]==a[N-1]) a[N]=inputNum;/*如果数组全都一样大,那么没有大小顺序,直接最后赋值 */
if(a[0]<a[N-1]){/*数组从小到大排列的情况 */
while(temp1<temp2-1){
temp=(temp1+temp2)/2;
if(inputNum<a[temp]) temp2=temp;
else temp1=temp;
}/*折半查找到temp1,temp2,有三种情况 */
if(inputNum>a[temp2]) temp=temp2+1;/*输入数最大,则输入数据位于最后 */
else if(inputNum<a[temp1]) temp = temp1;/*输入数最小,则输入为第一个 */
else temp =temp2;/*输入数占据temp2元素的位置 */
for(i=N;i>temp;i--) a[i]=a[i-1];/*temp后所有元素后移 */
a[temp]=inputNum; /*输入数据插入*/

}else{/*数组从大到小的情况 */
while(temp1<temp2-1){
temp=(temp1+temp2)/2;
if(inputNum>a[temp]) temp2=temp;
else temp1=temp;
}
if(inputNum<a[temp2]) temp=temp2+1;
else if(inputNum>a[temp1]) temp = temp1;
else temp =temp2;
for(i=N;i>temp;i--) a[i]=a[i-1];
a[temp]=inputNum;
}
for(i=0;i<=N;i++) printf(" %d ",a[i]);
getchar();
return 0;
}
假定数组从小到大,temp1,temp2是两个标识,会不断接近,最后形成temp1=temp2-1;最坏的情况就是我们输入的数最小,那么temp1=0,这个时候所有的数都要后移。如果我们输入的数最大,那么temp2=9,我们只需要最后令a[10]为我们输入的数。如果不是以上2种情况那么只需要把a[temp2]后的数后移,a[temp2]赋我们输入的数。

我这个算法并不是最优的。应该细节上可以改进.不过我这个程序包括了降序和升序情况,自动处理
小7学习ing
2007-12-29
知道答主
回答量:39
采纳率:0%
帮助的人:0
展开全部
int m[N] n[N+1];\\数组长度n自己设
int t,i,low,high,mid;\\设置上下标志和参量
low=0;high=N-1;\\参量初始化
printf("please input the data:%d \n",t);\\输入插入数据
while (!(t<m[mid]&&t>m[mid+1]))\\插入条件
{mid=(low+high)/2;\\二分法查找
if (t>m[mid])
high=mid-1;
if(t<m[mid])
low=mid+1;
}
for(i=0,i<n+1,i++)\\插入另外的数组
{if (i<mid)
n[i]=m[i];
else n[i]=t;
if (i>mid)
n[i]=m[i+1]
}
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
自由的菜鸟
2007-12-30 · TA获得超过2736个赞
知道大有可为答主
回答量:1657
采纳率:0%
帮助的人:1279万
展开全部
//给你 一个折半查找的例子!
//数组都由你自己输入
#include <stdio.h>
#include <string.h>

int BinSearch(int list[],int n,int key)
{
int mid,low,high;
int midvalue;
low=0;
high=n-1;
while(low<=high)
{
mid=(low+high)/2;
midvalue=list[mid];
if(key==midvalue)
return list[mid];
else if(key<midvalue)
high=mid-1;
else
low=mid+1;
}
return -1;
}

int main()
{
int a[10],i;
int midvalue;
char insert;
while(1)
{
printf("请输入10个数,中间以空格隔开: ");
for(i=0;i<10;i++)
scanf("%d",&a[i]);
printf("请输入要查找的数: ");
scanf("%d",&midvalue);
midvalue=BinSearch(a,10,midvalue);
if(midvalue!=-1)
{
printf("%d\n",midvalue);
break;
}
else
{
printf("没有您要查找的信息,重新查找请按y,退出请按n或任意键退出!\n\n");
insert=getch();
if(insert=='y'||insert=='Y')
printf("重新输入,");
else
break;
}
}

system("pause");
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式