問題:
Description
有數列{6 58 14 2 19 354 684 4}
(1)申請一個數組q,準備存放合併後的序列
(2)將原序列拆分爲左序列{6 58 14 2}與右序列{19 354 68 4}
(3)將左右數組分別有序排列成{2 6 14 58}及{4 19 68 354} [這一過程通過遞歸重複(2)~(7)實現]
(4)設定i,j分別爲兩序列的初始位置
(5)比較i,j位置對應元素大小,選擇小的放入數組q,同時將i或j加1
(6)重複步驟(5)直到i或j中有一個達到序列尾
(7)最後將剩餘的元素複製到數組q中,兩子序列就合併爲一個有序序列了
注:本題只需提交部分代碼,輸入n(n<=100)及n個整數,輸出按從小到大順序排列好的數據
#include <iostream>
using namespace std;
void MergeSort(int p[],int s,int m,int t)
{
int q[100]; //臨時數組q[100]用來存放排好的序列
int i,j,k; //i作爲左數組起始位置,j作爲右數組起始位置,k爲臨時數組位置
for (i=s,j=m+1,k=0; k<=t-s; k++)
{
if (i==m+1) //當i到達左數組的最後時,將右數組餘下元素複製到臨時數組中
{
q[k]=p[j];
j++;
continue;
}
if (j==t+1) //當j達到右數組最後時,將左數組剩餘元素複製到臨時數組中
{
q[k]=p[i];
i++;
continue;
}
///////////////////////////////////////////////////////////////////
/*
請在該部分填寫缺少的代碼
*/
////////////////////////////////////////////////////////////////////
}
for(i=s,j=0; i<=t; i++,j++) //將臨時數組的對應各項值賦給數組p[100]
p[i]=q[j];
}
void Merge(int p[],int s,int t)
{
if(s<t)
{
int m=(s+t)/2;
Merge(p,s,m); //遞歸對左數組進行歸併
Merge(p,m+1,t); //遞歸對左數組進行歸併
MergeSort(p,s,m,t); //合併數組
}
}
int main()
{
int n;//n爲輸入數據的個數
int p[100];
cin>>n;
for(int i=0; i<n; i++) //輸入n個數據
cin>>p[i];
Merge(p,0,n-1); //調用函數進行歸併
for(int i=0; i<n; i++)
cout<<p[i]<<" "; //輸出排列好的序列
cout<<endl;
return 0;
}
Input
n和n個整數
Output
從小到大排序
Sample Input
10
2 1 3 5 4 6 7 9 8 10
Sample Output
1 2 3 4 5 6 7 8 9 10
HINT
Source
代碼:#include <iostream>
using namespace std;
void MergeSort(int p[],int s,int m,int t)
{
int q[100]; //臨時數組q[100]用來存放排好的序列
int i,j,k; //i作爲左數組起始位置,j作爲右數組起始位置,k爲臨時數組位置
for (i=s,j=m+1,k=0; k<=t-s; k++)
{
if (i==m+1) //當i到達左數組的最後時,將右數組餘下元素複製到臨時數組中
{
q[k]=p[j];
j++;
continue;
}
if (j==t+1) //當j達到右數組最後時,將左數組剩餘元素複製到臨時數組中
{
q[k]=p[i];
i++;
continue;
}
if(p[i]<p[j])
{
q[k]=p[i];
i++;
}
else
{
q[k]=p[j];
j++;
}
}
for(i=s,j=0; i<=t; i++,j++) //將臨時數組的對應各項值賦給數組p[100]
p[i]=q[j];
}
void Merge(int p[],int s,int t)
{
if(s<t)
{
int m=(s+t)/2;
Merge(p,s,m); //遞歸對左數組進行歸併
Merge(p,m+1,t); //遞歸對右數組進行歸併
MergeSort(p,s,m,t); //合併數組
}
}
int main()
{
int n;//n爲輸入數據的個數
int p[100];
cin>>n;
for(int i=0; i<n; i++) //輸入n個數據
cin>>p[i];
Merge(p,0,n-1); //調用函數進行歸併
for(int i=0; i<n; i++)
cout<<p[i]<<" "; //輸出排列好的序列
cout<<endl;
return 0;
}
附:歸併排序圖解(來自:歸併排序算法原理分析與代碼實現):
小結:學習了排序中的歸併排序。