数据结构——顺序表的一些算法

 

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*/

 

posted @ 2018-12-17 15:07  王陸  阅读(1111)  评论(0编辑  收藏  举报