/*
* 采用分而治之思想实现数组排序, 递归为其实现技巧
*/
#include <iostream>
using namespace std;
void merge(int *array, int low, int mid, int high) {
// left: low ~ mid, right: mid+1 ~ high
int size = high - low + 1;
int *tmp = new int[size];
int i = low, j = mid+1, k = 0;
while (i <= mid && j <= high) {
if (array[i] <= array[j]) {
tmp[k++] = array[i++];
} else {
tmp[k++] = array[j++];
}
}
// the rest elements
while (i <= mid) {
tmp[k++] = array[i++];
}
while (j <= high) {
tmp[k++] = array[j++];
}
// copy the elements to original array
for (k = 0; k < size; ++k) {
array[k+low] = tmp[k];
}
}
void _mergeSort(int *array, int low, int high) {
if (low >= high) return;
int mid = low + ((high-low) >> 1);
_mergeSort(array, low, mid);
_mergeSort(array, mid+1, high);
merge(array, low, mid, high);
}
void mergeSort(int *array, int size) {
cout << "*****************before**************" << endl;
for (int i = 0; i < size; ++i) {
cout << array[i] << " ";
}
cout << endl;
_mergeSort(array, 0, size-1);
cout << "*****************after**************" << endl;
for (int i = 0; i < size; ++i) {
cout << array[i] << " ";
}
cout << endl;
}
int main() {
int array[] = {2, 3, 5, 1, 4, 9, 7, 6, 10};
mergeSort(array, 9);
return 0;
}
*****************before**************
2 3 5 1 4 9 7 6 10
*****************after**************
1 2 3 4 5 6 7 9 10
展开