最近学校学习递归,一开始想用递归做,做完发现好麻烦,就改成循环了,以下贴代码,记入一下自己遇到的问题和理解:
#include<stdio.h>
int main()
{
int a[20]={1,5,9,12,16,19,26,48,69,79,88,95};
int i,b,n,t;
int find(int *,int,int,int b);//找到那个数是第几位
void sort(int *,int ,int);//将那一位以后的向后移。
printf("输入共有几个数:");
scanf("%d",&n);
printf("输入要插入的数:");
scanf("%d",&b);
t=find(a,0,n-1,b);
sort(a,t,n-1);
a[t]=b;
for(i=0;i<n+1;i++){
printf("%-4d",a[i]);
}
return 0;
}
这个没什么解释的,就是主函数。
int find(int *p,int fir,int end,int b)
{
int mid,isPrime=1;
mid=(fir+end)/2;
while(isPrime){
if(b>p[mid]){
fir=mid+1;
mid=(fir+end)/2;
}else if(b==p[mid]){
isPrime=0;
}else{
end=mid-1;
mid=(fir+end)/2;
}
if(p[mid+1]>b&&p[mid]<b){
mid=mid+1;
isPrime=0;
}
if(p[mid]>b&&p[mid-1]<b){
isPrime=0;
}
}
return mid;
}
这个函数中要注意,这里分情况
if(p[mid+1]>b&&p[mid]<b){
isPrime=0;
}
if(p[mid]>b&&p[mid-1]<b){
isPrime=0;
mid=mid-1;
}
每次都取它后面的值,因为之后我们要对它返回的位数都后移,后移后会出现(假如我要插20)19.19这样的情况,如果不分情况,在不同数时输出的结果时对时错,如果取
前就是20.19的情况。
最后的一段就是后移,如下:
void sort(int *p,int t,int len)
{
int i;
for(i=len;i!=t-1;i--){
p[i+1]=p[i];
}
}
整体大概就是二分法的思想,希望能帮到有需要的人,我也会一直认真的写下博客,记录自己从大一开始的学习历程!