1. 程式人生 > >順序表應用5:有序順序表歸併(資料結構)

順序表應用5:有序順序表歸併(資料結構)

順序表應用5:有序順序表歸併

Time Limit: 100 ms Memory Limit: 880 KiB

Submit Statistic

Problem Description

已知順序表A與B是兩個有序的順序表,其中存放的資料元素皆為普通整型,將A與B表歸併為C表,要求C表包含了A、B表裡所有元素,並且C表仍然保持有序。

Input

 輸入分為三行:
第一行輸入m、n(1<=m,n<=10000)的值,即為表A、B的元素個數;
第二行輸入m個有序的整數,即為表A的每一個元素;
第三行輸入n個有序的整數,即為表B的每一個元素;

Output

 輸出為一行,即將表A、B合併為表C後,依次輸出表C所存放的元素。

Sample Input

5 3
1 3 5 6 9
2 4 10

Sample Output

1 2 3 4 5 6 9 10

 

本題的主要思想就是對兩個順序表中的元素進行大小的比較先輸出小的,再輸出最後較長的陣列中還未輸出的元素。

程式碼如下:

#include<bits/stdc++.h>
using namespace std;
int main()
{
	ios::sync_with_stdio(false);//優化輸入輸出速度 
	int m,n,i,j;
	cin>>m>>n;
	int a[10010],b[10010];
	for(i=0;i<=m-1;i++)
	{
		cin>>a[i];
	}
	for(int j=0;j<=n-1;j++)
	{
		cin>>b[j];
	}
	int k=0;//K的作用是判斷是不是第一個輸出,因為要考慮到空格以及換行的問題 
	for(i=0,j=0;i<=m-1&&j<=n-1;)
	{
		if(a[i]<b[j])//如果a[i]比較小輸出a[i] 
		{
			if(k==0)
			{
				cout<<a[i];
			}
			else
			{
				cout<<" "<<a[i];
			}
			i++;//之後a陣列標誌後移 
		}
		else//同理 
		{
			if(k==0)
			{
				cout<<b[j];
			}
			else
			{
				cout<<" "<<b[j];
			}
			j++;
		}
		k++;
	}
	for(k=i;k<=m-1;k++)//這裡是輸出a或b陣列中還未輸出的元素 
	{
		cout<<" "<<a[k];
	}
	for(k=j;k<=n-1;k++)
	{
		cout<<" "<<b[k];
	}
	return 0;
}