归并排序(Merge sort),是一种分治排序法,将排序任务分为三个部分:前半部分的递归排序、后半部分的递归排序以及已排好序的前后两部分的合并。
归并法是一种递归的算法,是通过函数的递归调用来实现的。
示例如下:
待排序数组:10 6 3 7 2 8 9 2 4 1 n = 10
Step1:原数组分为数组A: 10 6 3 7 2 和数组B:8 9 2 4 1的分别排序
Step2:对数组A进行排序,排序方法参照原始数组,分为两个数组进行排序
Step3:对数组B进行排序,排序方法参照原始数组,分为两个数组进行排序
Step4:将排序后的数组A和B进行合并
Step5:结束
实现代码如下:
void recursiveSort(double *, int, int);
void merge(double *, int, int, int);
void mergeSort(double *, int);
/* global pointer */
double *pCopy;
void merge(double *dataIn, int iBeg, int iMid, int iEnd)
{/* dataIn array divide into array A and B
* A from iBeg(included) to iMid(not included)
* B from iMid(included) to iEnd(not included)
* A and B are both well sorted.
*/
int begA = iBeg, endA = iMid, begB = iMid, endB = iEnd;
int i = iBeg;
for (i = iBeg; i < iEnd; ++i) {
if (dataIn[begA] < dataIn[begB])
pCopy[i++] = dataIn[begA++];
else
pCopy[i++] = dataIn[begB++];
}
if (begA < endA)
for (int j = begA; j < endA; ++j) pCopy[i++] = dataIn[j];
else
for (int j = begB; j < endB; ++j) pCopy[i++] = dataIn[j];
/* copy back */
for (int k = iBeg; k < iEnd; ++k) {
dataIn[k] = pCopy[k];
}
}
void recursiveSort(double *dataIn, int iBeg, int iEnd)
{/* 2012/08/23, by wbprime@myopera.com */
if (iEnd - iBeg > 1) {
int iMid = (iBeg + iEnd)/2;
mergeSort(dataIn, iBeg, iMid);
mergeSort(dataIn, iMid, iEnd);
merge(dataIn, iBeg, iMid, iEnd);
}
}
void mergeSort(double *dataIn, int sizeIn)
{
pCopy = new double[sizeIn];
recursiveSort(dataIn, 0, sizeIn);
delete [] pCopy;
}