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

📄 mgsort.c

📁 在定时器中断中做LED的PWM输出 AT89C2051实现A/D转换的C51程序 单片机开发系统 指令系统 程序设计 定时与中断 系统扩展 接口技术 串行口
💻 C
字号:
//归并排序算法设计。

#define MAX 16   	//元素个数的最大值

int R[MAX]={9,2,13,5,10,16,17,11,4,6,8,1,7} ; //用数组来储存元素
int R1[MAX]; 		//辅助数组

//归并两个有序文件段 : 
MERGE ( int P[ ],int Q[ ],int low,int mid,int high )
{	int	i,j,k;
	i=low;j=mid;k=low;
	while ( i<mid && j<high )		//取小者复制
		if ( P[i] <= P[j] ) Q[k++] = P[i++];
		else Q[k++] = P[j++];
	while ( i<mid )  Q[k++] = P[i++];//复制第一个文件的剩余元素
	while ( j<high )  Q[k++] = P[j++];//复制第二个文件的剩余元素
}

//对文件进行一遍归并操作 : 
MERGEPASS ( int M[ ], int N[ ],int length,int n)
{	int	i,j;
	i = 0;	//指向第一对子文件的起始端
	while ( i + 2*length - 1 < n ) {//归并两个长度为length的子文件
		MERGE ( M,N,i,i+length,i+2*length ) ;
		i+=2*length;		//指向下一对子文件的起始端
		}
	if  ( i + length < n )
		MERGE ( M,N,i,i+length,n ) ; //第二个子文件长度小于length
	else for ( j=i;j<n;j++ ) N[j] = M[j] ;//将最后一个子文件复制到N中
}

//对整个文件进行二路归并排序 : 
MERGESORT (int S[ ], int D[ ],int n) //排序结果仍然在S[ ]中
{
	int length = 1;	//从单个元素开始进行归并
	while ( length < n ) {	//只要整个文件还可以分成两个以上子文件
		MERGEPASS ( S,D,length,n); //进行一遍归并:S[n] ---> D[n]
		length *= 2; //加大子文件的长度
		MERGEPASS ( D,S,length,n); //再进行一遍归并,结果返回到S[ ]中
		length *= 2; //加大子文件的长度
		}
}

main ( )
{   
	int n=13;		//实际元素个数
	MERGESORT (R,R1,n); //调用归并排序算法
	while (1) ; //在这一行设置断点,中止程序运行,以便观察程序运行的结果 
}


⌨️ 快捷键说明

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