小白入門之歸併排序(Merge Sort)
//首先考慮下如何將將二個有序數列合併。這個非常簡單,只要從比較二個數列的第一個數,誰小就先取誰,取了後就在對應數列中刪除這個數。然後再進行比較,如果有數列為空,那直接將另一個數列的資料依次取出即可。
//可以將A,B組各自再分成二組。依次類推,當分出來的小組只有一個數據時,可以認為這個小組組內已經達到了有序,然後再合併相鄰的二個小組就可以了。這樣通過先遞歸的分解數列,再合並數列就完成了歸併排序。
#include <iostream>
using namespace std;
const int MAXN = 100;
void MergeSort(int a[], int l, int r);
void Merge(int a[], int l, int mid, int r);
int main()
{
int a[MAXN]{10, 23, 45, 7, 6, 34, 78, 3, 2, 1};
MergeSort(a, 0, 9);
for(int i=0; i<9; i++)
{
cout << a[i] << " ";
}
return 0;
}
void MergeSort(int a[], int l, int r)
{
if(l >= r)
{
return;
}
int mid = (l + r) / 2;
MergeSort(a, l, mid);
MergeSort(a, mid + 1, r);
Merge(a, l, mid, r);
}
void Merge(int a[], int l, int mid, int r)
{
int tmp[r - l + 1];
for(int i=l; i<=r; i++)
{
tmp[i - l] = a[i];
}
int i = l, j = mid + 1;
for(int k=l; k<=r; k++)
{
if(i > mid) //左半部分越界,將右方剩下的有序序列填入到陣列中
{
a[k] = tmp[j - l];
j++; //移動
}
else if(j > r) //右半部分越界,將右方剩下的有序序列填入到陣列中
{
a[k] = tmp[i - l];
i++;
}
else if(tmp[i - l] > tmp[j - l]) //左右部分依次逐個比較,將較小的元素放在原來陣列中
{
a[k] = tmp[j - l];
j++;
}
else if(tmp[i - l] < tmp[j - l])
{
a[k] = tmp[i - l];
i++;
}
}
}