本题要求实现二路归并排序中的归并操作,待排序列的长度1<=n<=1000。
函数接口定义:
void Merge(SqList L,int low,int m,int high);
其中L是待排序表,使排序后的数据从小到大排列。
###类型定义:
#include<stdio.h> #include<stdlib.h> typedef int KeyType; typedef struct { KeyType *elem; /*elem[0]一般作哨兵或缓冲区*/ int Length; }SqList; void CreatSqList(SqList *L);/*待排序列建立,由裁判实现,细节不表*/ void MergeSort(SqList L,int low,int high); void Merge(SqList L,int low,int m,int high); int main() { SqList L; int i; CreatSqList(&L); MergeSort(L,1,L.Length); for(i=1;i<=L.Length;i++) { printf("%d ",L.elem[i]); } return 0; } void MergeSort(SqList L,int low,int high) { /*用分治法进行二路归并排序*/ int mid; if(low<high) /*区间长度大于1*/ { mid=(low+high)/2; /*分解*/ MergeSort(L,low,mid); /*递归地对low到mid序列排序 */ MergeSort(L,mid+1,high); /*递归地对mid+1到high序列排序 */ Merge(L,low,mid,high); /*归并*/ } } /*你的代码将被嵌在这里 */
输入样例:
第一行整数表示参与排序的关键字个数。第二行是关键字值 例如:
10 5 2 4 1 8 9 10 12 3 6
输出样例:
输出由小到大的有序序列,每一个关键字之间由空格隔开,最后一个关键字后有一个空格
1 2 3 4 5 6 8 9 10 12
void Merge(SqList L,int low,int m,int high){ int a[1010],p=0,l=low,r=m+1; while(l<=m&&r<=high){ if(L.elem[l]<L.elem[r]){ a[p++]=L.elem[l++]; }else{ a[p++]=L.elem[r++]; } } while(l<=m){ a[p++]=L.elem[l++]; } while(r<=high){ a[p++]=L.elem[r++]; } for(int i=0;i<p;i++){ L.elem[low+i]=a[i]; } }
标签:归并,int,void,high,low,SqList,排序 From: https://www.cnblogs.com/kk4458/p/17011312.html