第1关:归并排序的递归算法
任务描述
本关任务:归并排序的递归算法。
测试说明
平台会对你编写的代码进行测试:
测试输入:
10
13 13 1 42 6 98 3 24 66 57
输入说明:
第一行为n,表示输入数组的n个整数。
第二行为数组的n个整数。
预期输出:
0,9,4
0,4,2
0,2,1
0,1,0
3,4,3
5,9,7
5,7,6
5,6,5
8,9,8
1 3 6 13 13 24 42 57 66 98
输出说明:
分行输出每趟递归调用排序的数组元素的区间下标,用逗号分隔。
最后一行输出排序的结果,数据之间用一个空格分隔。
代码如下
#include <iostream>
using namespace std;
#include <stdio.h>
#include<stdlib.h>
void input(int *&a,int & n);
void output(int *a,int n);
void Merge(int a[],int s,int m, int e);
void MergeSort(int a[],int s,int e);
int main()
{
int i,n;
int *a = NULL;
input (a,n);
MergeSort (a,0,n-1) ;
output(a,n);
free(a);
return 0;
}
/**********定义函数**********/
/********** Begin **********/
void input(int *&a,int &n){
scanf("%d",&n);
a = (int*)malloc(sizeof(int)*(n));
if(!a)
return ;
for(int i = 0; i < n; i++)
scanf("%d",&a[i]);
}
void output(int *a,int n){
for(int i = 0; i < n; i++)
printf("%d ",a[i]);
printf("\n");
}
void Merge(int a[],int s,int m, int e){
int i = s,j = m+1,k = 0;
int *b = (int*)malloc(sizeof(int)*(e-s+1));
while(i <= m&&j<=e){
if(a[i]<a[j]){
b[k++] = a[i++];
}else{
b[k++] = a[j++];
}
}
while(i <= m)
b[k++] = a[i++];
while(j <= e)
b[k++] = a[j++];
for(i = 0; i < k; i++)
a[s+i] = b[i];
free(b);
}
void MergeSort(int a[],int s,int e){
if(a==NULL || s >= e)
return ;
int mid = (s+e)/2;
printf("%d,%d,%d\n",s,e,mid);
MergeSort(a,s,mid);
MergeSort(a,mid+1,e);
Merge(a,s,mid,e);
}
/********** End **********/
第2关:归并排序的非递归算法
任务描述
本关任务:归并排序的非递归算法
测试说明
平台会对你编写的代码进行测试:
测试输入:
10
1 79 70 4 25 1 9 51 11 2
输入说明:
第一行:键盘输入待排序关键的个数n
第二行:输入n个待排序关键字,用空格分隔数据
预期输出:
0,1,0
2,3,2
4,5,4
6,7,6
8,9,8
0,3,1
4,7,5
8,9,9
0,7,3
0,9,7
1 1 2 4 9 11 25 51 70 79
输出说明:
分行输出两个两个地合并长度为length的子段时数组元素的下标。
最后一行输出排序的结果,数据之间用一个空格分隔。
代码如下
#include <stdio.h>
#include<stdlib.h>
#include<time.h>
void input(int *&a,int & n);
void output(int *a,int n);
void Merge(int a[],int low,int mid,int high);
void MergePass(int a[],int length,int n); //一趟二路归并排序
void MergeSort(int a[],int n); //二路归并算法
int main ()
{
int i,n,m;
int *a = NULL;
input (a,n);
MergeSort (a,n) ;
output(a,n);
free(a);
return 0;
}
/**********定义函数**********/
/********** Begin **********/
void input(int *&a,int & n){
scanf("%d",&n);
a = (int*)malloc(sizeof(int)*n);
if(!a)
return;
for(int i = 0; i < n; i++)
scanf("%d",&a[i]);
}
void output(int *a,int n){
for(int i = 0; i < n; i++){
printf("%d ",a[i]);
}
printf("\n");
}
void Merge(int a[],int low,int mid,int high){
int i = low,j = mid+1,k=0;
int *b = (int*)malloc(sizeof(int)*(high-low+1));
while(i<=mid&&j<=high){
if(a[i]<=a[j]){
b[k++] = a[i++];
}else{
b[k++] = a[j++];
}
}
while(i<=mid)
b[k++] = a[i++];
while(j<=high)
b[k++] = a[j++];
for(int i = 0 ; i < k;i++)
a[low+i] = b[i];
free(b);
}
void MergePass(int a[],int length,int n){
int low = 0,mid,high;
while(length+low-1 < n){
mid = low + length - 1;
high = mid + length;
if(high >= n)
high = n - 1;
Merge(a,low,mid,high);
printf("%d,%d,%d\n",low,high,mid);
low = high + 1;
}
} //一趟二路归并排序
void MergeSort(int a[],int n){
for(int i = 1; i < n; i*=2)
MergePass(a,i,n);
} //二路归并算法
/********** End **********/