8.12 给数组中的元素按顺序编号
本文已被浏览5400次
今天接到某同学求助,写篇新博客解析一下《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的图:
评论
您需要 先登录 才可以回复.