归并排序的基本思想是将若干个序列进行两两归并,直至所有待排序数列都在一个有序序列上为止:
如图通过二分法将输入序列不断分割,直至得到最小元素,即单个元素, 然后通过排列合并两个序列,直至原数列有序。
那么如何合并两个数列,并使其变得有序呢?
有数列a1,a2以及合并数列temp:不断比较a1,a2的首元素,将较小元素存入temp,将此元素从其所在序列中删除,若一个数列消耗完毕,则将另一个数列直接赋值到temp中,即可得到合并的有序数列。
c++实现如下:
#include <iostream>
#include <vector>
using namespace std;
void seperate(int*, int start, int end);
void merge(int*, int, int, int);
int main()
{
cout << "输入要排列的数的个数" << endl;
int N;
cin >> N;
char c;
int* a1 = new int[N];
for (int i = 0; i < N; ++i)
{
a1[i] = (rand() % (100 - 0 + 1)) + 0;
cout << a1[i] << " ";
}
cout << endl;
seperate(a1, 0, N - 1);
for (int j = 0; j < N; ++j)
cout << a1[j] << " ";
delete[] a1;
system("pause");
}
void seperate(int* arr, int start, int end)
{
if (start < end)
{
int mid = 0;
mid = (end + start) / 2;
seperate(arr, start, mid);
seperate(arr, mid + 1, end);
merge(arr, start, mid, end);
}
}
void merge(int *arr, int start, int mid, int end)
{
vector<int> temp;
int a = start;
int b = end;
int mid1 = mid + 1;
while (start <= mid && mid1 <= end)
{
if (arr[start] <= arr[mid1])
temp.push_back(arr[start++]);
else
temp.push_back(arr[mid1++]);
}
while (start <= mid)
temp.push_back(arr[start++]);
while (mid1 <= end)
temp.push_back(arr[mid1++]);
for (int i = 0; i < temp.size(); ++i)
arr[a + i] = temp[i];
}