归并排序算法,实现其中的mergeSort和merge两个函数。
函数接口定义:
void mergeSort(vector<int> &Array, int start, int end);
void merge(vector<int> &Array, int start, int mid, int end);
函数mergeSort完成归并排序(从小到大),其中 Array
是需要排序的数组,start
是Array
中排序部分的起始位置,end
是Array
中排序部分的结束位置。
函数merge完成数组中两个相邻有序部分(从小到大)的合并,合并后元素仍然有序(从小到大),其中 Array
是需要排序的数组,start
是第一个有序部分的起始位置,mid
是第一个有序部分的结束位置,第二个有序部分的起始位置为mid+1,end
是第二个有序部分的结束位置。
裁判测试程序样例:
#include <iostream>
#include <vector>
using namespace std;
void mergeSort(vector<int> &Array, int start, int end);
void merge(vector<int> &Array, int start, int mid, int end);
int main(){
int n;
vector<int> a;
vector<int>::iterator i;
//输入数组
cin >> n;
a.resize(n);
for(i = a.begin(); i != a.end(); i++){
cin >> *i;
}
//归并排序
mergeSort(a, 0, a.size()-1);
//输出数组
i = a.begin();
cout << *i++;
for( ; i != a.end(); i++){
cout << " " << *i;
}
return 0;
}
/* 此处将 放置 提交的函数代码 */
输入样例:
第一行为数组元素个数
第二行为空格间隔的各个数组元素
5
3 1 2 5 4
输出样例:
输出排序后的数组元素
1 2 3 4 5
参考代码
// 归并排序主函数
void mergeSort(std::vector<int> &Array, int start, int end) {
// 判断是否需要继续划分
if (start < end) {
// 计算中间位置
int mid = start + (end - start) / 2;
// 递归地对左半部分和右半部分进行归并排序
mergeSort(Array, start, mid);
mergeSort(Array, mid + 1, end);
// 合并已排序的左半部分和右半部分
merge(Array, start, mid, end);
}
}
// 归并函数,用于合并两个已排序的子数组
void merge(std::vector<int> &Array, int start, int mid, int end) {
int leftSize = mid - start + 1;
int rightSize = end - mid;
// 创建临时数组来存储左半部分和右半部分的元素
std::vector<int> leftArray(leftSize);
std::vector<int> rightArray(rightSize);
// 将元素复制到临时数组
for (int i = 0; i < leftSize; i++) {
leftArray[i] = Array[start + i];
}
for (int j = 0; j < rightSize; j++) {
rightArray[j] = Array[mid + 1 + j];
}
// 初始化合并过程的起始位置
int i = 0, j = 0, k = start;
// 比较左半部分和右半部分的元素,将较小的元素放入原数组
while (i < leftSize && j < rightSize) {
if (leftArray[i] <= rightArray[j]) {
Array[k] = leftArray[i];
i++;
} else {
Array[k] = rightArray[j];
j++;
}
k++;
}
// 处理剩余的元素(如果有)
while (i < leftSize) {
Array[k] = leftArray[i];
i++;
k++;
}
while (j < rightSize) {
Array[k] = rightArray[j];
j++;
k++;
}
}