📄 mgsort.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 + -