算法简述
归并排序就是利用归并的思想实现的排序方法。假设初始序列含有n个记录,则可将该序列看成n个有序的子序列,每个子序列的长度为1,然后两两归并,得到不小于(n/2)的最小整数个长度为2或者1的有序子序列;再两两归并,…,如此重复,直至得到一个长度为n的有序序列为止。下面以初始序列[50,90,10,30,70,40]为例来详细了解该算法的流程。
C++ 递归法实现
递归实现算法
void mergeSortRecursively(vector<int>& originalArray, int lengthArray) {
int mid;
if (lengthArray < 2)
return;
cout << "原始数组:";
Print1DArray_int(originalArray);
mid = lengthArray / 2;
vector<int> leftArray(mid, 0);
vector<int> rightArray(lengthArray - mid, 0);
int i;
for (i = 0; i < mid; i++)
leftArray[i] = originalArray[i];
for (i = mid; i < lengthArray; i++)
rightArray[i - mid] = originalArray[i];
cout << "划分后的左子数组:";
Print1DArray_int(leftArray);
cout << "划分后的右子数组:";
Print1DArray_int(rightArray);
cout << endl;
mergeSortRecursively(leftArray, mid);
mergeSortRecursively(rightArray, lengthArray - mid);
// 排序合并数组
mergeArray(originalArray, leftArray, mid, rightArray, lengthArray - mid);
cout << "排序后的数组:";
Print1DArray_int(originalArray);
cout << endl;
}
排序后再进行合并
void mergeArray(vector<int>& mergeArray, vector<int>& leftArray, int leftLength, vector<int>& rightArray, int rightLength) {
// 这里的mergeArray 是合并前的数组,这样就保证合并后的数组大小及元素值不变。
cout << "开始合并排序数组:";
Print1DArray_int(mergeArray);
int leftIndex = 0;
int rightIndex = 0;
int mergeIndex = 0;
while (leftIndex < leftLength && rightIndex < rightLength) {
if (leftArray[leftIndex] < rightArray[rightIndex])
mergeArray[mergeIndex++] = leftArray[leftIndex++];
else
mergeArray[mergeIndex++] = rightArray[rightIndex++];
}
// 处理leftArray或者rightArray提前索引完成
while (leftIndex < leftLength)
mergeArray[mergeIndex++] = leftArray[leftIndex++];
while (rightIndex < rightLength)
mergeArray[mergeIndex++] = rightArray[rightIndex++];
}
算法结果及分析
int main() {
cout << "输入排序前的数组:";
vector<int> numbers;
int temp;
while (cin >> temp) {
numbers.push_back(temp);
if (cin.get() == '\n')
break;
}
cout << "输入的数组为:";
Print1DArray_int(numbers);
mergeSortRecursively(numbers, numbers.size());
cout << "归并排序后的数组:";
Print1DArray_int(numbers);
return 0;
}
Print1DArray_int函数见之前的博文:C++常见的输入输出