代码如下:
下列的代码有几处trick。第一:在整个算法流程中,我们只分配了一次动态数组。第二,tmpArray在这里起到的作用是临时存储merge的结果,merge之后,需要把tmpArray里面的元素拷贝回arr。3,如果left==right,则我们认为arr已经有序了。
void merge(int arr[], int tmpArray[], int lPos, int rPos, int rightEnd) {
int i, leftEnd, NumElements, tmpPos;
leftEnd = rPos-1;
tmpPos = lPos;
NumElements = rightEnd-lPos+1;
while (lPos<=leftEnd&&rPos<=rightEnd) {
if (arr[lPos]<=arr[rPos]) {
tmpArray[tmpPos++] = arr[lPos++];
} else {
tmpArray[tmpPos++] = arr[rPos++];
}
}
while (lPos<=leftEnd) {
tmpArray[tmpPos++] = arr[lPos++];
}
while (rPos<=rightEnd) {
tmpArray[tmpPos++] = arr[rPos++];
}
for (i=0; i<NumElements; i++, rightEnd--) {
arr[rightEnd] = tmpArray[rightEnd];
}
}
void mSort(int arr[], int tmpArray[], int left, int right) {
int center;
if (left<right) {
center = (left+right)/2;
mSort(arr, tmpArray, left, center);
mSort(arr, tmpArray, center+1, right);
merge(arr, tmpArray, left, center+1, right);
}
}
void mergeSort(int arr[], int n) {
int* tmpArray = new int[n];
mSort(arr, tmpArray, 0, n-1);
delete[] tmpArray;
}
int main() {
int arr[10] = {-1, 9, 38, 17, 16, 45, 4, 3, 2, 91};
mergeSort(arr, 10);
for (int i=0; i<10; i++) {
cout << arr[i] << " ";
}
}