40 按要求输出序列

问题描述 :

明明的爸爸是一位著名的数学家。他在明明很小的时候就发现明明有过人的数学天赋,因此有意培养他对数学的兴趣。一次,明明的爸爸为了培养明明对数字的敏感,和明明玩起了一个数字游戏,这个游戏的名称叫“按要求输出序列”。在游戏中,明明的爸爸给了明明一串数字,要求明明首先把这串数字中重复出现的数字删除到仅剩一个,即相同的数字只保留一个,然后将这串数字从小到大进行排序。明明很快就理解了游戏的规则,开始玩起来。明明的爸爸首先给了明明三个数字:3、2、1;明明很快就回答说:“1、2、3”。明明的爸爸惊讶于明明的反应能力,开始加大游戏的难度,给出了由6个数字组成的数字串:2、1、4、3、5、2;明明眼珠子一转,脱口而出:“1、2、3、4、5”(由于“2”出现了两次,因此要删除一个,然后再排序输出。)。明明的爸爸意识到简单的数字串难不住明明,于是决定给出很长的一串数字串来考明明。但与此同时,明明爸爸面对这很长的数字串也无法一时计算出最后的结果,于是就求助于你,让你帮他写一个程序,用来计算出数字串最后的结果。

明明的爸爸的问题可以归结为:给你一个数字串,里面有n个数字,首先对数字串中的数字进行处理,删除重复出现的数字(重复出现的数字只保留一个),然后对数字串从小到大进行排序,最后输出排序后的字符串。

输入说明 :

你写的程序要求从标准输入设备中读入测试数据作为你所写程序的输入数据。标准输入设备中有多组测试数据,每组测试数据占两行:

第一行是一个正整数n(1≤n≤200),表示数字串中有n个数字,

第二行是n个数字,n个数字都大于等于0且小于等于109,每两个数字用一个空格隔开。

每组测试数据与其后一组测试数据之间没有任何空行,第一组测试数据前面以及最后一组测试数据后面也都没有任何空行。

输出说明 :

对于每一组测试数据,你写的程序要求计算出一组相应的运算结果,并将这一组运算结果作为你所写程序的输出数据依次写入到标准输出设备中。每组运算结果为一个排序后的数字串,数字串中的数字用一个空格隔开。每组运算结果单独形成一行数据,其行首和行尾都没有任何空格,每组运算结果与其后一组运算结果之间没有任何空行,第一组运算结果前面以及最后一组运算结果后面也都没有任何空行。 注:通常,显示屏为标准输出设备。

输入范例 :

5
4 2 2 6 6
9
76 19 1 2 55 37 38 55 76

输出范例 :

2 4 6
1 2 19 37 38 55 76

c源码:

#include<stdio.h>
int main()
{
	int n,a[220]={0},i=0,j,t,x;
 
   while(scanf("%d",&n)!=EOF)
   {
     memset(a,0,220);
	 for(i=0;i<n;i++)
		 scanf("%d",&a[i]);
	 t=0;
	 for(j=1;j<n;j++)
	 {
	   x=0;
	    for(i=0;i<=t;i++)
			if(a[i]==a[j])
				x=1;
		if(x==0)
		{
		  t++;
		  a[t]=a[j];
		}
	 }

	 for(i=0;i<=t;i++)
		 for(j=0;j<=t-i-1;j++)
			 if(a[j]>a[j+1])
			 {
			   x=a[j];
			   a[j]=a[j+1];
			   a[j+1]=x;
			 }
	  for(i=0;i<t;i++)
		  printf("%d ",a[i]);
	  printf("%d\n",a[t]);
   }
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,您的第一个问题是:用C语言给出一个记录序列,用堆的方法将其进行升序排列,输出结果,输出要求有文字说明。 首先,使用堆排序算法对记录序列进行升序排列需要使用堆数据结构和堆排序算法。堆是一种树形结构,可视为完全二叉树的数组对象。在堆中第i个元素的父节点是第(i-1)/2个元素,它的左子节点是第2i+1个元素,右子节点是第2i+2个元素。堆有两种类型:最大堆和最小堆。在最大堆中,父节点的值始终大于或等于其子节点的值,而在最小堆中,父节点的值始终小于或等于其子节点的值。 堆排序是一种基于比较的排序算法。它的基本思想是将待排序的序列构建成一个堆,然后进行排序。在堆排序过程中,首先将待排序的序列构建成一个最大堆或最小堆,然后将堆顶元素(即最大值或最小值)与序列中的最后一个元素交换。接下来,重新构建堆并重复以上步骤直到整个序列有序。 下面是使用堆排序算法对记录序列进行升序排列的C语言代码示例: ``` #include <stdio.h> // 宏定义 #define PARENT(i) ((i-1)/2) #define LEFT(i) (2*i+1) #define RIGHT(i) (2*i+2) // 堆调整 void max_heapify(int* arr, int i, int size) { int l = LEFT(i); int r = RIGHT(i); int largest = i; if(l < size && arr[l] > arr[largest]) largest = l; if(r < size && arr[r] > arr[largest]) largest = r; if(largest != i) { int temp = arr[i]; arr[i] = arr[largest]; arr[largest] = temp; max_heapify(arr, largest, size); } } // 建立最大堆 void build_max_heap(int* arr, int size) { for(int i=PARENT(size-1); i>=0; i--) { max_heapify(arr, i, size); } } // 堆排序 void heap_sort(int* arr, int size) { build_max_heap(arr, size); for(int i=size-1; i>0; i--) { int temp = arr[i]; arr[i] = arr[0]; arr[0] = temp; max_heapify(arr, 0, i); } } int main() { int arr[10] = {82,94,26,27,50,69,67,40,71,21}; int size = 10; // 输出排序前的记录序列 printf("排序前记录序列为:\n"); for(int i=0; i<size; i++) { printf("%d ", arr[i]); } // 堆排序 heap_sort(arr, size); // 输出排序后的记录序列 printf("\n排序后记录序列为:\n"); for(int i=0; i<size; i++) { printf("%d ", arr[i]); } printf("\n"); return 0; } ``` 在上述代码中,我们使用宏定义来计算堆中节点的父节点、左子节点和右子节点。max_heapify函数用于维护以i为根节点的子堆,使其符合最大堆的性质。build_max_heap函数用于建立最大堆,heap_sort函数用于进行堆排序。首先,我们将原始数组构建成最大堆,然后将堆顶元素(即最大值)与序列中的最后一个元素交换,此时堆的大小减1。接下来,我们针对堆顶节点进行堆调整,使其符合最大堆的性质。重复以上步骤直到整个序列有序。 在代码最后,我们使用printf函数输出排序前和排序后的记录序列,该函数使用格式化字符串输出内容。需要注意的是,为了确保输出质量,应该使用换行符(\n)来分隔不同的输出行。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值