有序表和並

2021-10-03 11:24:38 字數 1437 閱讀 6819

問題:將兩個有序順序表合併成乙個有序順序表。

演算法思想:不斷取兩個順序表表頭,比較大小,將小者存入新的有序順序表,直至其中乙個表比較完畢,將另乙個剩餘的表全部存入新的順序表。

如果合併後仍讓原序排列:

最好情況:其中乙個有序列表 的元素  一 一對應的小於 另乙個有序表的元素  ;

比較次數---min(m,n)次              時間複雜度o(min(m,n))

最壞情況:兩個表的元素交替增加 ;

比較次數---(m+n-1) 次時間複雜度o(m+m)

如果合併後讓原序的逆序排列:  無論最好還是最壞,時間複雜度o(m+n);

#include#include#include#define maxsize 50

int flag=1; //利用變數構造兩個不同的有序表

typedef struct sqlist;

// ---------------------------- 初始化-----------------------------

bool initlist(struct sqlist* l,int length)

flag=2;

l->length=length;

return true;

}void delete_same(struct sqlist* ll)

}ll->length=i+1;

}//------------------合併演算法--------------------

bool merge(struct sqlist* ll1,struct sqlist* ll2,struct sqlist* ll3)

else

}while(ilength)

while(jlength)

ll3->length=k;

return true;

} void print(struct sqlist *l)

printf("\n");

}int main()

print(&l1);

printf("\n\n");

if(initlist(&l2,10)==true)

print(&l2);

printf("\n\n");

if(initlist(&l3,20)==true)

//print(&l3);

printf("\n\n");

if(merge(&l1,&l2,&l3)==true)

printf("合併成功!\n");

print(&l3);

printf("\n\n");

}

HUSTOJ 有序表的最小和

一次奇怪的ac經歷。上週被這道題卡了3天。傳送門 給出兩個長度為n的有序表a和b,在a和b中各任取乙個元素,可以得到n2個和,求這些和中最小的n個。不要去重 第一行包含乙個整數n n 400000 第二行與第三行分別有n個整數,分別代表有序表a和b。整數之間由乙個空格隔開,大小在長整型範圍內,保證有...

排序單鏈表 並兩個有序鍊錶, 合併後依然有序

建立鍊錶節點結構 typedef struct strnode node typedef struct strnode pnode 鍊錶的排序,在這裡就是對於每個節點所存數字的比較。void bubble pnode pnode phead p1 phead while p1 null p2 p2 ...

有序表操作

void listinsert lnode h,elemtype e 有序單鏈表的插入演算法 void listinsert sqlist l,elemtype e 有序順序表的插入演算法 void unionlist lnode h1,lnode h2,lnode h 有序表的歸併演算法,採用單鏈...