从上两节毕业设计-数组变换01和毕业设计-数组变换02我们得到了b(n)和order(n),b(n)表示随机数组缩小后的数组,order(n)表示b(n)中相同元素出现的次序。今天我们要求的seq(n)是基于这两个数组,seq(n)表示b(n)下标的排列顺序,排序依据是b(n)下标对应的元素以及order(n)相同下标对应的元素。也就是说,首先看b(n)中的排序,当b(n)中元素相同,再看order(n)的元素顺序。
例1:b(n)=(2,1,3,4,5);
order(n)=(1,1,1,1,1);
seq(n)=(1,0,2,3,4);
例2:b(n)=(5,1,4,3,1,2,5);
order(n)=(1,1,1,1,2,1,2);
seq(n)=(1,4,5,3,2,0,6);
求解思路1:直接对b(n)进行遍历,当b(n)中元素相同时,再考虑order(n)。
伪代码:
for i=1:n
for j=1:n
if b(seq(j))>b(seq(j+1))||b(seq(j))==b(seq(j+1))&&order(seq(j))>order(seq(j+1))
seq=change(seq,j+1,j);
end
end
end
上述方法虽然可行,但是求出的seq是一连串的序列,无法看出b(n)中元素不同的下标在哪一块。这是有实际意义的,在需要考察实际意义的时候,就得注意对输出的结果进行区分,这样结果才能更符合人机交互的标准。
不妨称求解思路1求得的序列为seq1,最终输出为seq。
求解思路2:
对得到的se:1进行遍历,对于在b(n)中不同的元素的下标,进行插入一个‘-1’进行区分。在这路还需要考虑的就是最后输出的seq的长度,应该是n+max(b(n))-1。
代码实现:
package biyesheji;
public class Array_test03 {
/**
* After we get b(n) and order(n),we need use them to get sequence seq,
* seq represents the order of index of b in different station
*/
//create a function to generate seq
public int[] get_seq(int[] b,int[] order){
int[] seq1 = new int[b.length];
int[] seq = new int[b.length+maxvalue(b)-1];
int change = 0,i=0,j=0;
for(i=0;i<b.length;i++)
seq1[i] = i;
for(i=0;i<b.length;i++){
for(j=0;j<b.length-1;j++) {
if(b[seq1[j]]>b[seq1[j+1]]||(b[seq1[j]]==b[seq1[j+1]]&&order[seq1[j]]>order[seq1[j+1]])) {
change = seq1[j];
seq1[j] = seq1[j+1];
seq1[j+1] = change;
}
}
}
//insert '-1' differ different station
for(i = 0,j=0;i<seq1.length-1;i++) {
if(b[seq1[i]]==b[seq1[i+1]])
seq[j++] = seq1[i];
else {
seq[j++] = seq1[i];
seq[j++] = -1;
}
}
seq[j] = seq1[i];
System.out.print("b=");
show(b);
System.out.println();
System.out.print("order=");
show(order);
System.out.println();
System.out.print("seq1=");
show(seq1);
System.out.println();
System.out.print("seq=");
show(seq);
return seq;
}
public int maxvalue(int[] b){
int maxvalue = 0;
for(int i=0;i<b.length;i++){
if(b[i] > maxvalue)
maxvalue = b[i];
}
return maxvalue;
}
public void show(int[] seq){
for(int value:seq)
System.out.print(value+",");
}
public static void main(String[] args) {
int[] b = {5,1,4,3,1,2,5};
int[] order = {1,1,1,1,2,1,2};
Array_test03 test = new Array_test03();
test.get_seq(b, order);
}
}
输出结果:
在这一节,我们讨论了求解b(n)的下标顺序序列,并说明了在实际意义情况下,应该如何让自己的输出更符合人机交互的理念。后续,小编将会推出毕业设计后续系列,敬请期待!下一节我们讨论,如何在给定一个和b(n)相同维度的数组time(n),找出b(n)中相同元素的脚标对应的time(n)中元素的最大值。