【算法】采用分治法实现按升序排序的自顶向下二路归并排序算法(C++源码)
一、任务描述
请采用分治法实现按升序排序的自顶向下二路归并排序算法,设计测试用例以验证算法的准确性。
要求:使用STL中的vector存储输入数据以及中间数据
二、步骤描述
输入数组的个数,建立vector数组,建立合并算法merge(vector&a,vector&b,int l,int r,int m),建立合并排序递归算法mergesort(vector&a,vector&b,int l,int r),在左<右递归调用本身,输出排序后的vector数组。
三、程序运行结果截图
四、源代码-未使用vector(C++)
#include <iostream>
#include <cstring>
#include <cmath>
#include <stdio.h>
#include <stdlib.h>
using namespace std;
void merge_array(int* intArr1, int len1, int* intArr2, int len2)
{
int*list=(int*)malloc((len1+len2)*sizeof(int));
int i=0,j=0,k=0;
while(i < len1 && j < len2)
{
// 把较小的那个数据放到结果数组里, 同时移动指针
list[k++] = (intArr1[i] < intArr2[j]) ? intArr1[i++] : intArr2[j++];
}
// 如果 intArr1 还有元素,把剩下的数据直接放到结果数组
while(i < len1)
{
list[k++] = intArr1[i++];
}
// 如果 intArr2 还有元素,把剩下的数据直接放到结果数组
while(j < len2)
{
list[k++] = intArr2[j++];
}
// 把结果数组 copy 到 intArr1 里
for(i = 0; i < k; i++)
{
intArr1[i] = list[i];
}
//释放申请的空间
free(list);
}
void merge_sort(int* intArr, int intArr_len)
{
if(intArr_len > 1)
{
int* intArr1 = intArr;
int intArr1_len = intArr_len/2;
int* intArr2 = intArr + intArr_len/2;
int intArr2_len = intArr_len - intArr1_len;
merge_sort(intArr1,intArr1_len);
merge_sort(intArr2,intArr2_len);
merge_array(intArr1, intArr1_len, intArr2, intArr2_len);
}
}
int main()
{
int n,i;
cout<<"Please put the size of intArr:";
cin>>n;
int intArr[n];
cout<<"Please put the number of intArr:";
for(i=0;i<n;i++)
{
cin>>intArr[i];
}
merge_sort(intArr,n);
cout<<"Output the inArr after sorting:";
for(i=0;i<n;i++)
{
cout<<intArr[i]<<" ";
}
cout<<endl;
return 0;
}
五、源代码-使用vector(C++)
#include<iostream>
#include<vector>
using namespace std;
void merge(vector<int>&a,vector<int>&b,int l,int r,int m)
{
int i,j,id1,id2;
for(j=l;j<=r;j++)
{
b[j]=a[j];
id1=l;
}
i=1;
id2=m+1;
while(id1<=m&&id2<=r)
{
if(b[id1]<=b[id2])
{
a[i++]=b[id1++];
}
else a[i++]=b[id2++];
}
while(id1<=m)
{
a[i++]=b[id1++];
}
while(id2<=r)
{
a[i++]=b[id2++];
}
}
void mergesort(vector<int>&a,vector<int>&b,int l,int r)
{
int m;
if(l<r)
{
m=(l+r)/2;
mergesort(a,b,l,m);
mergesort(a,b,m+1,r);
merge(a,b,l,r,m);
}
}
int main()
{
int i,n;
cout<<"Please put the number size:";
cin>>n;
vector<int>a(n);
vector<int>b(n);
cout<<"Please put the number:";
for(i=0;i<n;i++)
{
cin>>a[i];
}
mergesort(a,b,0,n-1);
cout<<"Print the number:";
for(i=0;i<n;i++)
{
cout<<a[i]<<" ";
}
return 0;
}