排序原理与思想
将两个或两个以上有序的数列(或有序表),合并成一个仍然有序的数列(有序表),这种操作称为归并操作。这样的方法经常用于多个有序的数据文件归并成一个有序的数据文件。若将两个有序表合并成一个有序表则称为二路归并,同理,有三路归并、四路归并等。二路归并比较简单,所以我们只讨论二路归并。例如有两个有序表: (7,10,13,15)
和(4,8,19,20)
,归并后得到的有序表为: (4,7,8,10,13,15,19,20)
。
归并过程为:比较A[i]
和A[j]
的大小,若A[i]≤A[j]
,则将第一个有序表中的元素A[i]
复制到R[k]
中,并令i
和k
分别加1
,即使之分别指问后一单元,否则将第二个有序表中的元素A[j]
复制到R[k]
中,并令j
和k
分别加1
;如此循环下去,直到其中的一个有序表取完,然后再将另一个有序表中剩余的元素复制到R
中从下标k
到下标t
的单元.
程序实现
定义输入不解释
#include <bits/stdc++.h>
using namespace std;
int main ()
{
int n,m,a[1005]={
0},b[1005]={
0},c[2015]={
0},p=1,q=1,t=1; //p=a[];q=b[];t=c[]
cin>>n>>m;
for(int i=1;i<=n;i++){
cin>>a[i];
}
for(int i=1;i<=m;i++){
cin>>b[i];
}
for(int i=1;i<=(n+m);i++){
cout<<c[i]<<" ";
}
return 0;
}
然后,根据排序思路,我们不难写出以下代码:
while(p<=n&&q<=m){
if(a[p]<b[q]){
c[t]=a[p];
p++;t++;
}else{
c[t]=b[q];
q++;t++;
}
}
但是,这么些会漏掉后面的数字,所以我们加一串代码,将漏掉的数字补上来
if(p<=n){
for(int i=p;i<=n;i++){
c[t]=a[i];t++;
}
}
if(q<=m){
for(int i=q;i<=m;i++){
c[t]=b[i];t++;
}
}
完整代码如下:
#include <bits/stdc++.h>
using namespace std;
int main ()
{
int n,m,a[1005]={
0},b[1005]={
0},c[2015]={
0},p=1,q=1,t=1; //p=a[];q=b[];t=c[]
cin>>n>>m;
for(int i=1;i<=n;i++){
cin>>a[i];
}
for(int i=1;i<=m;i++){
cin>>b[i];
}
while(p<=n&&q<=m){
if(a[p]<b[q]){
c[t]=a[p];
p++;t++;
}else{
c[t]=b[q];
q++;t++;
}
}
if(p<=n){
for(int i=p;i<=n;i++){
c[t]=a[i];t++;
}
}
if(q<=m){
for(int i=q;i<=m;i++){
c[t]=b[i];t++;
}
}
for(int i=1;i<=(n+m);i++){
cout<<c[i]<<" ";
}
return 0;
}