8.12 给数组中的元素按顺序编号
本文已被浏览6035次
今天接到某同学求助,写篇新博客解析一下《8.12 给数组中的元素按顺序编号》这道题。
首先,我们先来分析一下题意:先排序,排序后和序号对应:
数[0] 数[1] 数[2] 数[3] 数[4] 数[5] 数[6] 数[7] 数[8] 数[9] 数[…] 数[N-1]
序[0] 序[1] 序[2] 序[3] 序[4] 序[5] 序[6] 序[7] 序[8] 序[9] 序[…] 序[N-1]
然后根据原始数据的顺序输出对应序号
根据上面的说法,我们发现:可以将原始数据备份一下,然后对其进行排序,排序后对应序号,最后用原始数据和排序完的进行比较,相同就输出对应序号,不同就比对下一个
算法为:
Step 0:Input Raw[N]
Step 1:计算Raw的长度L
Step 2:在Line数组的前L个元素中放入1~L
Step 3:将Raw复制为Box
Step 4:冒泡排序Box
Step 5:匹配Box与Line中的元素
Step 6:依次取出Raw中的元素与Box中的元素进行比对如果比对成功,则输出对应位置Line的元素
转为代码:
#include <stdio.h>
int main(){
//定义变量
/*Raw是原始数据
Box用来排序
Line是序号*/
int Raw[10],Box[10],Changed,a,b,c,i;
int Line[10];
//初始化Line={1,2,3,4,5,6,7,8,9,10}
for(i=0;i<10;i++){
Line[i]=i+1;
}
//读入Raw的元素
//好懒的方法O__O "…
scanf("%d%d%d%d%d%d%d%d%d%d",&Raw[0],&Raw[1],&Raw[2],&Raw[3],&Raw[4],&Raw[5],&Raw[6],&Raw[7],&Raw[8],&Raw[9]);
//复制数据到Box
for(i=0;i<10;i++){
Box[i]=Raw[i];
}
/*******************
冒泡排序
Changed代表是否有元素位置发生变化
当无元素位置变化时,说明顺序已经排好
注:自认为算法不错
********************/
for(Changed=1;Changed;b++){
//预备下一次不用再排了
Changed=0;
for(i=0;i<9;i++){
if(Box[i]>Box[i+1]){
//换位置
c=Box[i];
Box[i]=Box[i+1];
Box[i+1]=c;
//位置有变,改变量,需要再次扫描是否需要排序
Changed=1;
}
}
}
//要将相同元素的排号统一!!!!!!
//这个绝对不能少,要考虑到可能会同时出现两个
//(或多个)第一大而没有第二大(或第二~第X大的数字)
//相同的数字以较小序号的为准
for(i=0;i<9;i++){
if(Box[i]==Box[i+1]){
Line[i+1]=Line[i];
}
}
//开始比对,如果一样输出最后对应的序号
for(i=0;i<10;i++){
//↑取Raw的值
for(a=0;a<10;a++){
//↑取Box的值
if(Raw[i]==Box[a]){
//相等说明对上号了,打印!
printf("%3d",Line[a]);
//后边的就不用看了,直接比对下一个Raw值
break;
}
}
}
//最后输出换行符是过不去的~~无知的程序~~
printf("n");
return 0;
}
最后贴上一张AC的图:
评论
您需要 先登录 才可以回复.