归并排序思想:
- 划分为两个子序列
- 分别对每个子序列归并排序
- 有序子序列合并
/*两路归并排序算法框架*/
template <class Record>
void MergeSort(Record Array[], Record TempArray[], int left, int right){
//Array为待排序数组,left,right两端
int middle;
if (left < right){ //序列中只有0或1个记录,不用排序
middle = (left + right) / 2; //平分为两个子序列
//对左边一半进行递归
MergeSort(Array, TempArray, left, middle);
//对右边一半进行递归
MergeSort(Array, TempArray, middle + 1, right);
Merge(Array, TempArray, left, right, middle); //归并
}
}
//两个有序子序列都从左向右扫描,归并到新数组
template <class Record>
void Merge(Record Array[], Record TempArray[], int left, int right, int middle){
int i, j, index1, index2;
//将数组暂存入临时数组
for (j = left; j <= right; j++)
TempArray[j] = Array[j];
index1 = left; //左边子序列的起始位置
index2 = middle + 1; //右边子序列的起始位置
i = left; //从左开始归并
while (index1 <= middle&&index2 <= right){
//取较小者合并数组中
if (TempArray[index1] <= TempArray[index2])
Array[i++] = TempArray[index1++];
else
Array[i++] = TempArray[index2++];
}
while (index1 <= middle) //只剩下左序列,可以直接复制
Array[i++] = TempArray[index1++];
while (index2 <= right) //与上个循环互斥,复制有序列
Array[i++] = TempArray[index2++];
}