描述:设顺序表A中的数据元素递增有序。试写一算法,将元素x插入到顺序表的适当位置上,以保持该表的有序性。
思路:题目中说A是一个顺序表,所以我们首先用结构体定义顺序表:
#define M 0x3f3f3f3f;
typedef struct sqlist{
int data[M];
int length;
}Sqlist;
而我们知道对于顺序表,若是要插入一个元素,则需要使插入位置及其之后的元素都向后移动一个位置。因此插入操作之前,我们不妨先做好让顺序表的长度增加一这一准备工作。
现在来进行插入。题目中已经说明顺序表A是一个递增的有序表,所以选择与data[i]比较大小,如果插入元素x<=data[i],就在i位置上插入元素x,data[i]及其以后的元素向后移动。如果遍历了整个data数组都未发现比x大或者相等的元素,那么x一定放在最后一个位置,即我们在准备工作中添加的data[length]这一位置。因此在x传入的时候,我们需要将x与最后一个元素比较:如果小于等于最后一个元素,则遍历进行插入;如果大于最后一个元素,则直接将其放在data[length]。
代码如下:
void insert(Sqlist*L,int x){
int i,j;
L->length++; //准备工作,先让data多出一个位置。
if (x>L->data[length-2]){ //判断x与最大元素的大小关系,如果x更大则直接插入在最后。
L->data[length-1]=x;
}
else{ //x比最大元素小。
for (i=0;i<=L->length-2;i++){
if(x<=L->data[i]){ //比较大小找到插入位置。
for (j=L->length-2;j>=i;j--){
L->data[j+1]=L->data[j]; //data[i]及其以后的元素向后移动。
}
L->data[i]=x; //插入x
break;
}
}
}