//归并排序的特点:递归的应用
//需要准确并深入的理解递归的思想
#include <iostream>
#include <string>
# define NUM 8
using namespace std;
void Msort(int* a, int*tmpa, int left, int right);
int* MergeSort(int* a, int N);
void Merge(int* a , int* tmpa, int L, int R, int rend);
void Msort(int* a, int*tmpa, int left, int right)
{
int center=0;
int j = 0;
if(left < right){
center = (left + right)/2;
Msort(a, tmpa, left, center);
Msort(a, tmpa, center+1, right);
Merge(a, tmpa, left, center+1, right);
cout<<left<<center+1<<right<<endl;
for(j = left; j < right+1; j++){
cout<<"a["<<j<<"]="<<tmpa[j]<<' ';
}
cout<<endl;
}
}
int* MergeSort(int* a, int N)
{
int * tmpa;//按照算法解析,tmpa是一个指向int型的指针
tmpa=new int[NUM];
if(tmpa!=NULL){
Msort(a, tmpa, 0, N-1);
delete [] tmpa;
}
else
cout<<"there are no space for tmpa array!"<<endl;
return a;
}
//需要合并的这个数组,是被分成已排序的左右两个部分
//该函数的作用是,将这个数组进行整体排序
//归并的核心思想
void Merge(int* a , int* tmpa, int L, int R, int rend)
{
int i, lend, num, tmpos;
int left;
left = L;
lend = R-1; //此处的R对应的其实只是整个数组的中心,也就是两个已排序数组的分界点而已,并不是整体的末尾
tmpos = L; //用来作为新数组的索引
num = R-L+1;//需要合并的元素个数
while(L <= lend && R <= rend){
if(a[L] <= a[R])
tmpa[tmpos++]=a[L++];
else
tmpa[tmpos++]=a[R++];
}
while(L <= lend)
tmpa[tmpos++]=a[L++];
while(R <= rend)
tmpa[tmpos++]=a[R++];
for(left; left <= rend; left++)
a[left]=tmpa[left];
}
int main()
{
int unsorted[NUM]={24,13,26,1,2,27,38,15};
//int tmp[8] = {0};
MergeSort(unsorted,NUM);
int i=0;
/*for(i=0; i < NUM; i++){
//cout<<"unsorted["<<i<<"]="<<unsorted[i]<<' ';
cout<<unsorted[i]<<' ';
}*/
for(auto b :unsorted)
cout<<b<<' ';
return 0;
}
排序算法--归并排序(MergeSort)
最新推荐文章于 2021-06-07 18:19:52 发布