1. 程式人生 > >數據結構——線性表的一些算法

數據結構——線性表的一些算法

序表 int 一個 空間 move 部分 length tlist 排列

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

數據結構——線性表的一些算法