#include <iostream>
using namespace std;
void Merge(int Array[], int begin, int middle, int end){
int n1 = middle - begin;
int n2 = end - middle;
//动态申请内存空间大小,使其能存储正好足够的数据
int *left = new int[n1];
int *right = new int[n2];
/*注意:left,right 在不断迭代过程中已经排好序了,在后面只需要比较,赋值给Array就可以了,最后总体赋值,因为单个元素满足不了begin==end*/
//数组两边的数赋值到动态数组内
for(int i = 0; i < n1; i++)
left[i] = Array[begin + i]; //从begin开始赋值,因为
for(int i = 0; i < n2; i++)
right[i] = Array[middle + i]; //从middle开始赋值
//最初的数组赋值进行归并排序
int i = 0, j = 0, key;
for(key = begin; key < end; key++){
if(i < n1 && left[i] <= right[j])
Array[key] = left[i++];
else if(j < n2 && left[i] >= right[j])
Array[key] = right[j++];
else if(i == n1 && j < n2){ //万一left赋值完了,right还有很多呢?此语句即可解决这个问题
Array[key] = right[j++];
}
else if(j == n2 && i < n1){ //同上
Array[key] = left[i++];
}
}
}
//将数组元素分成单个元素进行处理
void MergeSort(int Array[], int begin, int end){
//这里和两链表的合并很像,也复习了数据结构链表这一节
if(begin + 1 < end){ //保证只有一个值的时候退出,防止多余计算,
int middle = (end + begin) / 2; //这里可以想想int关于奇数和偶数的除法运算,但是仔细想想都不影响结果
MergeSort(Array, begin, middle);
MergeSort(Array, middle, end);
Merge(Array, begin, middle, end); //如何排序交给Merge函数即可
}
}
int main(){
//数据的初始化
int n;
cin>>n;
int Array[n];
//输入数据
for(int i = 0; i < n; i++)
cin>>Array[i];
MergeSort(Array, 0, n); //数组排序
//输出排序后的结果
for(int i = 0; i < n; i++)
cout<<Array[i]<<" ";
cout<<endl;
return 0;
}
合并排序
最新推荐文章于 2025-05-27 21:52:10 发布