問題:將兩個有序順序表合併成乙個有序順序表。
演算法思想:不斷取兩個順序表表頭,比較大小,將小者存入新的有序順序表,直至其中乙個表比較完畢,將另乙個剩餘的表全部存入新的順序表。
如果合併後仍讓原序排列:
最好情況:其中乙個有序列表 的元素 一 一對應的小於 另乙個有序表的元素 ;
比較次數---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 有序表的歸併演算法,採用單鏈...