归并排序

第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 **********/
  • 4
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
以下是使用数组实现中文大写数字的 C 代码: ``` #include <stdio.h> #include <string.h> char *chinese_number[] = {"零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖"}; char *big_unit[] = {"", "万", "亿", "兆", "京", "垓", "杼", "穰", "沟", "涧", "正", "载", "极", "恒河沙", "阿僧祇", "那由他", "不可思议", "无量大数"}; void print_number(char *number) { int len = strlen(number); int i, j, k; char digit[5] = "0000"; // 数字位,最多为四位,不足四位用 0 填充 int unit_index = 0; // 大单位索引 printf("中文大写:%s\n", number); // 将数字按照四位一组进行分组,从低位到高位处理 for (i = len - 1; i >= 0; i -= 4) { k = 0; // 填充数字位 for (j = 0; j < 4 && i - j >= 0; j++) { digit[j] = number[i - j]; k++; } // 处理数字位,从高位到低位处理 for (j = k - 1; j >= 0; j--) { // 处理非零数字 if (digit[j] != '0') { printf("%s", chinese_number[digit[j] - '0']); // 处理数字位 switch (j) { case 0: printf("元"); break; case 1: printf("拾"); break; case 2: printf("佰"); break; case 3: printf("仟"); break; } } else { // 处理连续的零 if (j != k - 1 && digit[j+1] != '0') { printf("零"); } } } // 处理大单位 if (unit_index < sizeof(big_unit) / sizeof(char *)) { printf("%s", big_unit[unit_index]); } unit_index++; } } int main() { char number[50]; printf("请输入一个整数:"); scanf("%s", number); print_number(number); return 0; } ``` 示例输出: ``` 请输入一个整数:1234567890123456 中文大写:1234567890123456 壹仟贰佰叁拾肆万伍仟陆佰柒拾捌亿玖仟零壹佰贰拾叁万肆仟伍佰陆拾 ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

杼蛘

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值