归并排序是利用递归和分治技术将数据划分成越来越小的半子表,再对半子表排序,最后再利用递归方法将排序的半子表合并成越来越大的有序序列。
#include<iostream>
using namespace std;
void merge(int a[], int p, int q, int r) {
int n1 = q - p+1;
int n2 = r - q;
int* left = new int[n1];
int* right = new int[n2];
size_t i = 0, j = 0, k = 0;
for ( i = 0,k=p; i < n1; i++,k++)
{
left[i] = a[k];
}
for ( i = 0,k=q+1; i < n2; i++,k++)
{
right[i] = a[k];
}
for (i = 0,j=0,k=p; i < n1 && j<n2; k++)
{
if (left[i]<right[j])
{
a[k] = left[i];
i++;
}
else
{
a[k] = right[j];
j++;
}
}
if (i<n1)
{
while (i < n1) {
a[k] = left[i];
i++;
k++;
}
}
if (j<n2)
{
while (j < n2) {
a[k] = right[j];
j++;
k++;
}
}
}
void mergeSort(int a[],int p,int r) {
if (p<r)
{
int m = (p + r) / 2;
mergeSort(a, p, m);
mergeSort(a, m + 1, r);
merge(a, p, m, r);
}
}
int main()
{
int a[] = { 5,4,9,8,7,6,0,1,3,2 };
int len = sizeof(a)/sizeof(int);
//cout << len << endl;
mergeSort(a, 0, len - 1);
for (size_t i = 0; i < len; i++)
{
cout << a[i] <<endl;
}
system("pause");
return 0;
}