//归并排序
#include<iostream>
#include<fstream>
#include<cstdlib>
#include<windows.h>
//#include<ctime>
using namespace std;
const int MAXSIZE=1001;//待排序数据规模,r[0]保留,实际数组是r[1]---r[500]
//归并排序法Merge()+MergePass()+MergeSort()
//r[s]--r[m];r[m+1]--r[t]
void Merge(int r[],int r1[],int s,int m,int t)//一次归并算法5参
{
int i=s;//i从s到m
int j=m+1;//j从m+1到t
int k=s;//k从s到t
while(i<=m && j<=t)
{
if(r[i]<=r[j])
r1[k++]=r[i++];
else
r1[k++]=r[j++];
}
if(i<=m)
{
while(i<m)
r1[k++]=r[i++];
}
else
{
while(j<t)
r1[k++]=r[j++];
}
}
void MergePass(int r[],int r1[],int n,int h)//一趟归并算法4参,分为3种情况
{
int i=1;//i代表着一开始时候的归并位置。//h代表着归并长度
while(i<=n-2*h+1)//有两个h长度的子序列
{
Merge(r,r1,i,i+h-1,i+2*h-1);
i=2*i;
}
if(i>n-h+1)//只剩一个h长度和一个小于h长度的子序列
Merge(r,r1,i,i+h-1,n);
else//只剩一个子序列了
for(int k=i;k<=n;k++)
r1[k]=r[k];
}
void MergeSort(int r[],int r1[],int n)//2路归并非递归算法3参
{
//h代表着一开始时候的归并长度
int h=1;
while(h<n)
{
MergePass(r,r1,n,h);
h=2*h;
MergePass(r1,r,n,h);
h=2*h;
}
}
//void MergeSort()//2路归并递归算法
//{
//
//}
//从外存data.txt读取数据至内存数组
void read_data(int data[])
{
ifstream infile("data_salary.txt",ios::in);
if(!infile)
{
cerr<<"open data_salary.txt error!"<<endl;
system("pause");
//exit(1);
}
for(int i=1;i<MAXSIZE;i++)
infile>>data[i];
infile.close();
}
//输出内存数组至外存ordered_data_salary.txt文件
void write_data(int data[])
{
ofstream outfile("ordered_data_salary.txt",ios::out);
if(!outfile)
{
cerr<<"open ordered_data_salary.txt error!"<<endl;
system("pause");
//exit(1);
}
outfile<<"共用时:"<<data[0]<<"微秒"<<endl;
for(int i=1;i<MAXSIZE;i++)
outfile<<data[i]<<endl;
outfile.close();
}
//测试时间开始
inline LARGE_INTEGER time_begin()
{
LARGE_INTEGER start_time;
QueryPerformanceCounter(&start_time);//获取时钟计数
return start_time;
}
//测试时间结束
inline LARGE_INTEGER time_end()
{
LARGE_INTEGER end_time;
QueryPerformanceCounter(&end_time);
return end_time;
}
//主函数
int main(void)
{
int data[MAXSIZE];//建立待排序数据数组
int data1[MAXSIZE];//归并排序的辅助空间
read_data(data);//读数据
double time_test;//计算排序测试时间
LARGE_INTEGER Freq;//64位有符号整数值
QueryPerformanceFrequency(&Freq);//获取时钟周期,“1次/秒”,Hz
//测试时间开始
LARGE_INTEGER time1=time_begin();
//排序算法开始
int n=MAXSIZE-1;
MergeSort(data,data1,n);
//测试时间结束
LARGE_INTEGER time2=time_end();
time_test=( (time2.QuadPart - time1.QuadPart)*1000000/Freq.QuadPart );
//此处*1000,以毫秒为单位;*1000 000以微妙为单位
cout<<"堆排序法:已经排好顺序,请查看:ordered_data_salary.txt文件!"<<endl;
cout<<"排序时间:"<<time_test<<" 微秒"<<endl;
data[0]=time_test;//data[0]处存放排序时间
write_data(data);//写数据
system("pause");
return 0;
}
7、归并排序法Merge()+MergePass()+MergeSort()
最新推荐文章于 2023-05-15 11:50:50 发布