数据结构——顺序表的一些算法
1.已知线性表(a0,a1,a2,….an)按顺序存储,且每个元素都是均不相等的整数,设计把所有的比a0大的数移到其右边,把所有比a0小的数移到其左边的算法。
要求:时间最少,辅助空间最少。
解题思路:其实这就是一趟快速排序,a0到位,比它小的交换到低端,比它大的交换到高端。
void move(SqList L) { int i=0,j=L.length-1; int key=L.elem[0]; while (i<j) { while (i<j &&L.elem[j]>=key) --j; { L.elem[i]=L.elem[j];///比枢纽小的交换到底端 ++i; } while (i<j && L.elem[i]<=key) ++i; { L.elem[j]=L.elem[i];///比枢纽大的交换到高端 --j; } } L.elem[i]=key;///枢纽到位 }
2.已知线性表LA和 LB中的数据元素按值非递减有序,现要求将LA和LB归并为一个新的线性表LC,且LC中的数据元素仍按值非递减有序排列。
LA=(3,5,8,11)
LB=(2,6,8,9,11,15,20)
则:LC=(2,3,5,6,8,8,9,11,11,15,20)
解题思路:先设LC为空表,然后将LA或LB中的元素逐个插入到LC中即可。LC中元素按值非递减有序排列。 设指针i和j分别指向LA和LB中某个元素,若设i当前所指元素为ai,j当前所指元素为bj,则当前应插入到LC中的元素ck为
ai 当ai<=bj时
ck=
bj 当ai>bj时
void MergeList(SqList La, SqList Lb, SqList *Lc) { /* 本算法将非递减的有序表 La 和 Lb 归并为 Lc*/ /*Lc的数据元素也按值非递减有序*/ int i=0,j=0,k=0; int ai,bj; InitList(Lc);/*构造空的线性表Lc*/ Lc->length=La.length+Lb.length; /*Lc表的长度*/ while((i<=La.length-1)&&(j<=Lb.length-1)) { /* La和Lb均非空,i =0, j = 0, k = 0*/ ai=La.elem[i]; /*取La中第i个元素*/ bj=Lb.elem[j];/*取Lb中第j个元素*/ if (ai<=bj) /* 将 ai 插入到 Lc 中*/ { ListInsert(Lc,k,ai); ++i; ++k; } /*if*/ else /* 将 bj 插入到 Lc 中*/ { ListInsert(Lc,k,bj); ++j; ++k; } /*else*/ } while(i<=La.length-1)///La非空且Lb空时,将La剩下的部分插入Lc中 { ai=La.elem[i]; ListInsert(Lc, k, ai); ++i; ++k; } while(j<=Lb.length-1)///Lb非空且La空时,将Lb剩下的部分插入Lc中 { bj=Lb.elem[j]; ListInsert(Lc, k, bj); ++j; ++k; } }/* merge_list*/