构造数组与基本排序问题

文章向导

何为构造数组
思想与应用
构造数组与排序

一、何为构造数组

  首先明确,此处所谈及的构造并非C++中构造函数相关的概念。构造数组并非只是简单地创造一份数组,而是让创建出来的数组存放具有某种特定含义的内容(这些内容可以是数字,也可以是字符串等)。然后,在有需要时就能够直接查询该表格(数组),从而简化问题的实现。
  
二、思想与应用

  上面已对构造数组的基本思想做了简要描述,实际上大家在过往的编程经历中基本都接触过这种方法,但那或许是无意识、不清晰的使用。而本文则重在于加强这种意识,以便形成一种基本的编程思想。
  更为明确的说法——构造数组也就是利用数组的下标以及元素内容来指示特定含义的事物。这样做的好处一般体现在算法层面,比如可以将繁琐臃肿的分支判断转换为数组查询,亦可理解为以空间换取时间的算法思想

三、构造数组与排序

  下面通过一些具体的实例来阐述并运用这种编程思想。本文主要例举的是有关排序的问题,但文章末尾也会给出笔者之前写的另一篇文章,它们也是有关构造数组的问题(感兴趣的读者可以参阅学习)。

1. 桶排序的引入
在这里插入图片描述
  既然是桶排序,那么自然应该有桶的身影出现,所以笔者特意放上几个木桶以作分析。假定现在给定两行输入:第一行为n,代表有n个数将输入第二行为输入的n个数字(每个数字的范围是1~10)。而想要的则是将它们从小到大(或是从大到下)排序后输出
  比如:第一行输入5,第二行输入1 5 3 3 4;
  预想的输出:(从小到大) 1 3 3 4 5
  在正式进行讲解说明之前,希望读者先思考下下面所提出的几个问题:

  • Q1:桶在这里的作用是什么,用来装输入的数字?
  • Q2:需要多少个桶呢?
  • Q3:桶的序号又代表了什么?

  现在逐一解释上面提到的几个问题:

  • A1:桶在这里可以用实际的整型数组来表示,它的作用好比多个计数器,记录是每种数字所出现的次数。
  • A2:部分读者可能会认为需要n个桶,但结合A1的答案可知——桶的数量与键入数字的大小范围有关,本例中他是1~10,故我们需要10个桶。
  • A3:桶的序号与范围内的每个数字一一对应,相当于待会将输入的每个数字对号入座,进行计数统计。

  有了上述的分析,现在不妨用一种编程语言将它实现出来(这里以C++为例):

#include<iostream>

using namespace std;

int main(){

	int a[11]={0}; //下标0舍弃 
	int n,tmp;
	
	cin>>n;
	
	for(int i=1;i<=n;i++){
		cin>>tmp;
		a[tmp]++; //计数
	}
	
	//从小到大排序输出
	for(int i=1;i<=10;i++){
		for(int j=1;j<=a[i];j++){ //根据计数输出
			cout<<i<<" ";
		}
	} 
	
	return 0;
} 

2.桶排序的应用

  对刚才的内容有了一定的理解后,就可以考虑将桶排序的方法进行扩展运用。比如将刚才那份代码的最后输出部分中的内层for循环删掉,只留下cout<<i; 那么则可以实现去重复+从小到大排序。而如果是想实现从大到小的顺序,则只需将输出部分的外层for循环改为从大到小枚举(这里的i就是桶的序号)即可。
  最后,笔者想以一个略微综合的问题来结束本篇文章,而如果读者对构造数组的体验还感到不过瘾的话,可以参阅第3部分所提供的实例。
  现考虑这样一个例子:输入一个整数N,输出N中出现最多的数字及出现的次数。若最多的数字不止一个,则输出数值较大的那一个。
  比如:输入22568889
  预想的输出:8(数字),3(次数)
  下面我们用之前所说明的构造数组的方式来完成,但到此的读者最好还是先自己尝试完成一下,然后再对比思路。

#include<iostream>
#include<cstring>

using namespace std;

int main(){

	int a[10]={0}; //数字范围:0~9 
	char ch[100];
	
	cin>>ch;
	
	for(int i=0;i<strlen(ch);i++){
		a[ch[i]-'0']++;
	}
	
	for(int i=9;i>=0;i--){
		if(a[i]>1){
			printf("max=%d, times=%d",i,a[i]);
			break;
		}
	} 
	
	return 0;
} 

<测试结果>
在这里插入图片描述
3.更多相关实例

  一些稍微复杂有难度的例子,我在另外一篇文章中也有分析和注解,感兴趣的读者可以点击下方的链接参阅学习。
https://blog.csdn.net/a574780196/article/details/83629533

参阅资料
C++ primer
算法笔记
狄泰软件学院C++教程

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值