#include<vector>
#include<iostream>
using namespace std;
void Merge(int a[], int front, int mid, int end) {
/*int* aux = new int[end - front + 1];*/
vector<int>aux( end - front + 1 );
int start1 = front, end1 = mid;
int start2 = mid + 1, end2 = end;
for (int i = front; i <= end; i++) { //复制一个相同的辅助数组aux
aux[i-front] = a[i];
}
for (int i = front; i <= end; i++) {
if (start1 <= end1 && start2 <= end2) { //s1数组和s2数组都没排完
if (aux[start1 - front] <= aux[start2 - front]) { //比较两个有序数组的start值
a[i] = aux[start1 - front]; //选择其中较小值
start1++; //头指针后移
}
else {
a[i] = aux[start2 - front];
start2++;
}
}
else if (start1 > end1) { //s1数组排完,s2数组未完
a[i] = aux[start2 - front]; //a[i]值为s2的值
start2++; //头指针后移
}else if (start2 > end2) {
a[i] = aux[start1 - front];
start1++;
}
}
}
void MergeSort(int a[], int front, int end) {
int mid = (front + end) / 2; //(0+9)/2=4
if (end <= front)return; //分割至只有1个元素为止
MergeSort(a, front, mid); //左边数组递归归并排序,使得左子序列有序
MergeSort(a, mid + 1, end); //右边数组递归归并排序,使得右子序列有序
Merge(a, front, mid, end); //将两个有序子数组合并操作
}
int main() {
int a[10] = { 10,9,8,7,6,5,4,3,2,1 };
MergeSort(a, 0, 9);
for (int i = 0; i < 10; i++) {
printf("%d ", a[i]);
}
return 0;
}
归并排序
最新推荐文章于 2023-12-11 10:45:47 发布