求解一道数据结构[C语言版]的题

设顺序表Y中的元素递增有序.试写一算法,将X插入到顺序表的适当位置上,以保持该表的有序性.谢谢!
有人来帮帮忙吗? 要的是算法啊!这是C代码吧?

用折半法!假设Y为递增的整数序列,用数组a[n]来表示:
/*
设顺序表Y中的元素递增有序.试写一算法,将X插入到顺序表的适当位置上,以保持该表的有序性.
*/
#include <stdio.h>

int* find(int *min,int *max,int i){
int *mid;
if((max-min)>1){ //如果剩下超过2个数
mid=min+(max-min)/2; //则取中间的一个数的地址值
} else{ //如果只剩下2个数
return max; //则返回较大数的地址给主函数
}
if(*mid>i){ //如果中间这个数(*mid)比i大
max=mid; //则把中间这个数设为最大的数
find(min,max,i); //继续查找
}else{ //如果中间这个数(*mid)比i小
min=mid; //则把中间这个数设为最小的数
find(min,max,i); //继续查找
}
}

int main(){
int a[]={1,4,6,7,8,10,17,29,54,69,88,90,107};
int n=sizeof(a)/sizeof(int);
int i=0;
printf("原序列为: ");
while(i<n){printf("%d ",a[i]);i++;}

int x=84;//所要插入的数
printf("\n请输入要插入的数:");
scanf("%d",&x);

int a2[n+1];

if(x>=a[n-1]){//如果x大于数组中最大的数
a2[n]=x;//把x插入数组末尾
for(i=0;i<n;i++) a2[i]=a[i];
}else if(x<a[0]){//如果x小于数组中最小的数
a2[0]=x;//把x插入数组开头
for(i=0;i<n;i++) a2[i+1]=a[i];
}else{ //如果x介于数组最小值与最大值之间
int *tmp;
tmp=find(&a[0],&a[n-1],x); //从a[0]与a[n-1]之间找到x插入的位置
for(i=0;i<n+1;i++){
if(&a[i]<tmp){
a2[i]=a[i];
}else if(&a[i]==tmp){
a2[i]=x;
}else{
a2[i]=a[i-1];
}
}
}

printf("插入%d后的序列为:",x);
i=0;
while(i<=n){printf("%d ",a2[i]);i++;}
printf("\n");
return 0;
}

晕!算法不是更简单吗? 精华就是那个find函数。自己提炼一下吧。 写算法主要是那个find函数要写详细,主函数可以用伪代码表示。
温馨提示:答案为网友推荐,仅供参考
第1个回答  2010-03-31
从要插入的位置开始后面的元素都往后移动一个位置,然后把要插入的数据放到空出来的位置上!
相似回答