#include <stdio.h> #include <stdlib.h> #include <time.h> #include <iostream> #include <vector> // 输出数组元素 void printArr(int* arr, int len) { for (int i = 0; i < len; i++) { printf("%d ", *(arr+i)); } } // 随机生成数组数据 void randArr(int* arr, int len, int maxVal) { srand((int)time(0)); for (int i = 0; i < len; i++) { *(arr+i) = rand() % maxVal; } } // 合并子数组 arr[low...mid] 和子数组 arr[mid+1...high] void Merge(int* arr, int low, int mid, int high) // 如何归并是关键 { //extern void *memcpy(void *dest, void *src, unsigned int count); int index; int* temp = new int[high-low+1]; // 临时空间用来存放合并后的数组 int firstStart = low; int firstEnd = mid; int secondStart = mid+1; int secondEnd = high; for (index = 0; firstStart <= firstEnd && secondStart <= secondEnd; index++) { if (arr[firstStart] <= arr[secondStart]) { temp[index] = arr[firstStart]; ++firstStart; } else { temp[index] = arr[secondStart]; ++secondStart; } } // 第一个序列有剩余,直接拷贝粘贴 if (firstStart <= firstEnd) { memcpy(temp+index, arr+firstStart, (firstEnd-firstStart+1)*sizeof(int)); } if (secondStart <= secondEnd) { memcpy(temp+index, arr+secondStart, (secondEnd-secondStart+1)*sizeof(int)); } // 将排序好的序列拷贝回数组 memcpy(arr+low, temp, (high-low+1)*sizeof(int)); // 释放内存空间 delete temp; } void MergeSort(int* arr, int first, int last) // 分治递归思想 { int mid = 0; if (first < last) { mid = first + (last - first) / 2; // 分治思想,把数组平均分成两份 // 三步走:分解->>解决->>合并 MergeSort(arr, first, mid); MergeSort(arr, mid+1, last); Merge(arr, first, mid, last); } } int main(int argc, char* argv[]) { int len = 15; int* arr = new int[len]; randArr(arr, len, 100); printf("before sort:/n"); printArr(arr, len); MergeSort(arr, 0, len-1); printf("/nafter mergeSort:/n"); printArr(arr, len); printf("/n"); // 释放动态内存空间 delete arr; return 0; } 运行结果: 参考维基百科 http://www.google.com.hk/url?q=http://zh.wikipedia.org/wiki/%25E5%25BD%2592%25E5%25B9%25B6%25E6%258E%2592%25E5%25BA%258F&sa=U&ei=2zUFTsX_BOSdmQW0tKDKDQ&ved=0CA4QFjAA&usg=AFQjCNHC05Ezfw-Px0x2CnRNVDLCwwIkJw