有序表

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/fighting123678/article/details/82705931

1、定义
若线性表中的数据元素相互之间可以比较,而且数据元素在线性表中依值非递减或非递增有序排列,则称该线性表为有序表。
2、这里写图片描述


这里写图片描述


这里写图片描述


这里写图片描述

3、链式有序表合并

两个有序递增集合合并到另外一个集合中,另一个集合也是递增排列。

(1)指针pa和pb初始化,分别指向La和Lb的第一个结点。
(2)Lc的结点取值为La的头结点。
(3)指针pc初始化,指向Lc的头结点。
(4)当指针pa和pb均未到达相应表尾时,则依次比较pa和pb所指向的元素值,从La或Lb中取元素值较小的结点插入到Lc的最后。
(5)将非空表的剩余段插入到pc所指结点之后。
(6)释放Lb的头结点。

void Merge_L(LinkList &La,LinkList &Lb,LinkList &Lc)
{
    LinkList pa,pb,pc;
    pa=La->next;pb=La->next;
    Lc=La;
    pc=Lc;
    while(pa&&pb)//La和Lb均未=到达表尾,依次比较,然后存放到Lc中;
    {
        if(pa->data<pb->data)
        {
            pc->next=pa;pc=pa;pa=pa->next;
        }
        else
        {
            pc->next=pb;pc=pb;pb=pb->next;
        }
        pc->next=pa?pa:pb;//插入剩余段;
        free(Lb);//释放Lb的头结点;
    }
}

注意:
(1)算法分析:在归并两个链表为一个链表的时候,不需另建新表的结点空间,而只需将原来两个链表中结点之间的关系解除,重新暗元素值非递减的关系将所有结点链接成一个链表即可,所以空间复杂度为O(1)

4、顺序有序表合并

(1)创建一个表长为m+n的空表LC。
(2)指针pc初始化,指向LC的第一个元素。
(3)指针pa和pb初始化,分别指向La和Lb的第一个元素。
(4)当当pa和pb均未到达相应表尾时,则依次比较pa和pb所指向的元素值,从La或Lb中取元素值较小的结点插入到Lc的最后。
(5)如果pb已经到达Lb的表尾,依次将La的剩余元素插入Lc最后。
(6)如果pb已经到达Lb的表尾,依次将La的剩余元素插入Lc最后。

void Merge_L(LinkList La,LinkList Lb,LinkList &Lc)
{
    Lc.length=la.length+lb.length;
    Lc.elem=(ElemType*)malloc(Lc.length*sizeof(ElemType));
    ElemType *pa,*pb,*pc,*pa_last,*pb_last;
    pc=Lc.elem;//指针pc指向新表中第一个元素;
    pa=La.elem;//指针pa和pb的初值分别指向两个表中第一个元素;
    pb=Lb.elem;
    pa_last=La.elem+La.length-1;//指针pa_last指向la的最后一个元素;
    pb_last=Lb.elem+Lb.length-1;//指针pb_last指向lb的最后一个元素;
    while((pa<=pa_last)&&(pb<=pb_last))
    {
        if(*pa<=*pb)  *pc++=*pa++;
        else *pc++=*pb++;
    }
    while (pa<=pa_last) *pc++=*pa++;//Lb已经到达表尾,依次将La中剩余元素插入到Lc中;
    while (pb<=pb_last) *pc++=*pb++;//La已经到达表尾,依次将Lb中剩余元素插入到Lc中;
}

注意:
(1)因为在La和Lb中的值非递减(递增),所以,对于Lb中的元素,不需要从头到尾全部搜索。如果两个表长分别记为m+n;则算法的时间复杂度为O(m+n)

猜你喜欢

转载自blog.csdn.net/fighting123678/article/details/82705931