您的位置:首页 > 其它

线性表的顺序存储---习题

2016-03-26 15:01 176 查看
今天完成了一些与线性表相关的习题,总结如下

Q1:设顺序表有10个元素,其元素类型为整型。 设计一个算法,以第一个元素为分界线,将所有小于它的元素移到该元素的前面,将所有大于它的元素移到该元素的后面;

A:此为数据结构老师在课堂上提出的一个问题,如果了解快速排序算法的原理,此题便十分简单,只需将快速排序最后的两次递归去掉即可。

代码如下(条件是已知顺序表l存在)

status divide(sqlist *l,int pos){
int i=0,j=l->length-1;
elemtype temp,pivot=l->data[0];/*pivot即为题目中所说的第一个元素,也称枢纽元素*/
while(i<j){
while(i<j&&l->data[j]>pivot)/*从右向左找比pivot小的元素*/
j--;
if(i<j){
l->data[i++]=l->data[j];/*如果找到,将其存至顺序表左侧*/
}
while(i<j&&l->data[i]<pivot)/*从左向右找比pivot大的元素*/
i++;
if(i<j){
l->data[j--]=l->data[i];/*如果找到,将其存至顺序表右侧*/
}
}
l->data[i]=pivot;
return OK;
}


Q2:定义一个采用顺序结构存储的线性表,设计算法完成下面的工作:

1、删除元素在[x, y]之间的所有元素,要求算法的时间复杂度为O(n),空间复杂度为O(1);

2、将所在奇数移到所有偶数的前面,要求算法的时间复杂度为O(n),空间复杂度为O(1)。

A:第一道题来自数据结构教材后习题,要求找出给定范围内的元素并删除,正面入手较为复杂,涉及删除操作,会有大量的数据需要移动。反面入手则显得简单且高效,只需要将不在此范围的元素予以保留并将表长修改为余下元素个数即可,代码如下:

/*删除指定范围内的元素*/
status deleteeleminrange(sqlist *l,int x,int y){
int i=0,k=0,t=0;//k用来记录不在x,y范围内的元素
if(x>y)/*检查参数是否正确,不正确则进行修正*/
{
t=x;
x=y;
y=t;
}
for(i=0;i<l->length;i++){
if(l->data[i]>y||l->data[i]<x)
l->data[k++]=l->data[i];
}
l->length=k;/*切记修改表长*/
}


A:第二个问题还是用类似分离元素的思想进行解决,从两头向中间遍历,当未到达中央分界线是,对从两边分别找到的偶数和奇数进行交换,最后即可得到结果;

status moveeven(sqlist *l){
int i=0,j=l->length-1;
elemtype temp;
while(i<j){
while(i<j&&l->data[j]%2==0)//寻找奇数
j--;
while(i<j&&l->data[i]%2!=0)//寻找偶数
i++;
if(i<j){//未到达中间时进行交换
temp=l->data[j];
l->data[j]=l->data[i];
l->data[i]=temp;
}
}
return OK;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: