⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 二路归并排序.cpp

📁 八种排序的方法,利用VC++实现,值得借鉴
💻 CPP
字号:
#include<iostream.h>
#include<stdlib.h>
#include<time.h>
#include<math.h>
#include<stdio.h>

const int n=1000000;

typedef struct{
	int key;
}RedType;

typedef struct{  
RedType  *r;       //r[n+1];
int length;
}SqList;


int random();
void Merge(SqList &R,SqList &R1,int low, int mid,int high);
void MergePass(SqList &R,SqList &R1,int m,int len);
void MergeSort(SqList &R,SqList &R1,int m);
void main(){ 
//	int m;
	//m=log10(double(n+1))/log10(double(2));
  	SqList L;
    SqList L1;
	L.r = new RedType[n+1];
	L1.r=new RedType[n+1];
	L.length=n;
	for(int i=1;i<=n;i++)	L.r[i].key=random();
	long t1,t2;	
	t1=clock();
    MergeSort(L,L1,n);
	t2=clock();
	cout<<" 时间: "<<float(t2-t1)/CLK_TCK<<endl;
//	for(i=1;i<=n;i++)
//		cout<<L.r[i].key<<endl;
	
	
}
int random(){
    	int A=48271;
	int M=2147483647;
	int Q=M/A;
	int R=M%A;
	static int x=1;	int x1;
	x1=A*(x%Q)-R*(x/Q);
	if(x1>=0) x=x1;
	else	x=x1+M;
	return x;
}

void Merge(SqList &R,SqList &R1,int low, int mid,int high)
{
		int i,j,k;
		i=low;j=mid+1;k=low;
		 while(i<=mid&&j<=high)
    	 if(R.r[i].key<=R.r[j].key)
			R1.r[k++]=R.r[i++];
			else  R1.r[k++]=R.r[j++];
			while(i<=mid) R1.r[k++]=R.r[i++];
			while(j<=high) R1.r[k++]=R.r[j++];
}

void MergePass(SqList &R,SqList &R1,int m,int len){  //对R做一趟归并,结果在R1中
int i,j;
i=1;                                 //i指第一对子表的起始点
while(i+2*len-1<=m){                  //归并长度为len的两个子表
Merge(R,R1,i,i+len-1,i+2*len-1);
i=i+2*len;                           //指向下一对子表起始点
}
if(i+len-1<m)                        //剩下两个子表,其中一个长度小于len
Merge(R,R1,i,i+len-1,m);
else                               //子表个数为奇数,剩一段
for(j=i;j<=m;j++)                    //将最后一个表复制到R1中
R1.r[j]=R.r[j];
}


void MergeSort(SqList &R,SqList &R1,int h) {        //对R二路归并排序,结果在R中(非递归算法)
int len;
len=1;
while(len<h){
MergePass(R,R1,h,len);len=len*2;         //一趟归并,结果在R1中
MergePass(R1,R,h,len);len=len*2;         //再次归并,结果在R中

}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -