improved mergesort

本文介绍了一种改进的归并排序算法,通过减少递归调用和使用额外数组来提高效率。该算法在不同的数据段长度上进行划分,并通过合并操作将有序子数组整合成最终有序数组。实验结果显示,此方法在处理大规模数据集时表现出显著的性能提升。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

//两种方式改进归并,一是不递归;二是用两个数组,减少了重复赋值
#include <windows.h>
#include <iostream>
#include <math.h>
#include <ctime>
#include <cstring>
using namespace std;
LARGE_INTEGER BegainTime ;    
LARGE_INTEGER EndTime ;    
LARGE_INTEGER Frequency ;
#define n 5000
int arra[n]={0};
int arrb[n]={0};
int flag=0;
void rand_data()
{
 for(int i=0;i<n;i++)
 arra[i]=rand()%100000;
}
void merge_arra_arrb(int j,int k,int part1,int part2)//arra to arrb
//将arra中第j位置起的part1个元素和第k位置起的part2个元素经归并后移到arrb中第j个位置起part1+part2
{
 for(int ij=j,ik=k,it=j;ij<j+part1&&ik<k+part2;it++)
 {
  if(arra[ij]<arra[ik]){arrb[it]=arra[ij];ij++;}
  else {arrb[it]=arra[ik];ik++;}
 }
 while(ij!=j+part1)arrb[it++]=arra[ij++];
 while(ik!=k+part2)arrb[it++]=arra[ik++];
}
void merge_arrb_arra(int j,int k,int part1,int part2)//arrb to arra
{
 for(int ij=j,ik=k,it=j;ij<j+part1&&ik<k+part2;it++)
 {
  if(arrb[ij]<arrb[ik]){arra[it]=arrb[ij];ij++;}
  else {arra[it]=arrb[ik];ik++;}
 }
 while(ij!=j+part1){arra[it++]=arrb[ij++];}
 while(ik!=k+part2){arra[it++]=arrb[ik++];}
}
void merge_improve()
{
 //int *arrb= new int [n];
 
 int m=log(n)/log(2);
 m++;//m表示最外层循环次数
 //cout<<" "<<m<<endl;
 int k,part1,part2,part=1;//数据段长1,2,4,8,16...
 for(int i=0;i<m;i++)
 {
  //cout<<"in for widest "<<endl;
  for(int j=0;j<n;j+=2*part)
  {
   //cout<<"in part circular "<<endl;
   if(j+part<n){
    //cout<<"in if (j+part<n) "<<endl;
       k=j+part;//分别从j,k处开始
    part1=part;
    if(k+part<n)part2=part;
    else part2=n-k;
   }
   else {
    //cout<<"in else (j+part<n) "<<endl;
    part1=n-j;
    k=j;part2=0;
   }
   if(i%2==0)
   {merge_arra_arrb(j,k,part1,part2);flag=1;}
//将arra中第j位置起的part1个元素和第k位置起的part2个元素经归并后移到arrb中第j个位置起part1+part2
   else {merge_arrb_arra(j,k,part1,part2);flag=0;}
  }
  part=part*2;
 }
}
int main()
{
 cout<<"oupin "<<n<<"number"<<endl;
 //int *data = new int[n];
 //if(!data) exit(1);
 /*int k = n;
 while(k --){
 cin >> arra[n-k-1];
 }*/

 double time[100];
  double sum_s=0;
  double average;

 rand_data();
 /*if(flag==0)
 for(int i=0;i<n;i++)
  cout<<arra[i]<<" ";
 else
  for(int i=0;i<n;i++)
  cout<<arrb[i]<<" ";
  cout<<endl;*/
  /*clock_t e,s,average,total=0.0;
  for(int j=0;j<100;j++)
  { s = clock();//clock_t
  cout<<" time s "<<s<<endl;
   merge_improve();
    e = clock();//clock_t
    cout<<" time e "<<e<<endl;
   total+=e-s;
  }
  average=total/100;*/
 
  for(int j=0;j<100;j++)
    {
                   //CreateEulerGraph(&G);
                   QueryPerformanceFrequency(&Frequency);    
                   QueryPerformanceCounter(&BegainTime) ;  
                   merge_improve();//FindEulerCircuit(G);
                   QueryPerformanceCounter(&EndTime);  
                  cout<<"程序运行时间(单位:s):  "<<(double)( EndTime.QuadPart-BegainTime.QuadPart )/ Frequency.QuadPart <<endl;
       time[j]=(double)( EndTime.QuadPart-BegainTime.QuadPart )/ Frequency.QuadPart;
                   sum_s=sum_s+time[j];         
    }
    average=sum_s/100;
    cout<<"程序运行100次平均时间为:"<<average<<endl;

 /*  显示部分
 if(flag==0)
 for(int i=0;i<n;i++)
  cout<<arra[i]<<" ";
 else
  for(int i=0;i<n;i++)
  cout<<arrb[i]<<" ";
 
 cout << endl;*/
 cout << "the algrothem used average time is " << average << " miliseconds."
 << endl;
 return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值