分治法的步骤:
1. divide
2. conquer
3. combine
#include<stdio.h>
#include<iostream>
using namespace std;
//Below algorithm is according MIT's charles.
void merge(int a[], int first, int mid, int last)
{
int* res = new int[last - first + 1];
int i, j, k;
i = first;
j = mid + 1;
k = 0;
while (i <= mid && j <= last)
{
if (a[i] <= a[j])
res[k++] = a[i++];
else
res[k++] = a[j++];
}
while (i <= mid)
res[k++] = a[i++];
while (j <= last)
res[k++] = a[j++];
for (i = 0; i < k; i++)
a[first++] = res[i];
delete []res;
}
void mergeSort(int a[], int first, int last)
{
if (first < last)
{
int mid = (first + last)/2;
mergeSort(a, first, mid);
mergeSort(a, mid + 1, last);
merge(a, first, mid, last);
}
}
void outputArray(int a[], int n)
{
for (int i = 0; i < n; i++)
cout<<a[i]<<" ";
cout<<endl;
}
int main(int argc, char * argv[])
{
int a[] = {-4, 3, 56, -15, 34, 0, -14, 4};
int n = sizeof(a)/sizeof(int);
mergeSort(a, 0, n-1);
outputArray(a, n);
}