我写了以下代码来排名2组分数:
public class ScoreRanking {
public static void main(String[] args) {
int[] score1 = { 9, 3, 6, 19 };
int[] score2 = { 3, 3, 3, 3, 3, 5, 1 };
int[] rank1 = sortScores(score1);
int[] rank2 = sortScores(score2);
for (int i = 0; i < rank1.length; i++) {
System.out.println((i + 1) + ": " + rank1[i]);
}
System.out.println("_________\n");
for (int j = 0; j < rank2.length; j++) {
System.out.println((j + 1) + ": " + rank2[j]);
}
}
static int[] sortScores(int[] sort) {
for (int i = 0; i < sort.length - 1; i++) {
if (sort[i] < sort[i + 1]) {
continue;
} else {
int temp = sort[i];
sort[i] = sort[i + 1];
sort[i + 1] = temp;
}
}
return sort;
}
}
第一组是有序但第二组不是。我玩括号,尝试了不同的顺序(int score 1 ... int rank1 ... int score2 ... int rank2 ... / int score2 ...,int rank2 ... int score1 ... int rank1 ...) - 但得分2始终被“忽略”。有人可以告诉我为什么吗?
答案 0 :(得分:0)
我建议你按照dev8080的建议查找排序算法。您的排序算法只会通过列表一次,这是闻所未闻的。虽然你的排序算法可能最终适用于第一个数组,但对于第二个数组,它有问题:
if (sort[i] < sort[i + 1])
在这种情况下,即使它们相等也会交换值,这意味着你不必要地交换那些3。这可能没有明显的效果,但这是一个浪费的操作,对于更复杂的对象可能会产生不良影响。
无论如何,您的代码只会在
时交换值sort[i] = 5
sort[i + 1] = 1
因为这是第一个值小于第二个值的唯一地方。这就是你得到结果的原因
1: 3
2: 3
3: 3
4: 3
5: 3
6: 1
7: 5
看起来您正在尝试实施冒泡排序的变体,在这种情况下,您应该查看此链接:
https://en.wikipedia.org/wiki/Bubble_sort
请记住,对于较大的列表,冒泡排序效率不高
答案 1 :(得分:0)
我做了一个冷调试,我认为你的问题在于sortScores方法。 如果我没有错,则rank2数组的排序方式如下{3,3,3,3,3,1,5}。
你面临的主要问题是你的算法只改变了i和i + 1元素,但当你的i + 2元素低于i元素时会发生什么,那么方法失败并不会发生工作正确。
如果你想开发一个排序算法,我建议首先使用5或4个元素对数组进行排序,然后尝试理解你在做什么,用伪代码编写步骤,最后转换成Java更长,但我保证你会更满意,但是如果你想对数组进行排序现在就写,你应该检查维基百科上的排序算法,并对Insertion sort进行特殊查看,这很容易理解,并且不会#39; t有很多复杂性。
最后,如果你想使用java库来节省时间并对它们进行编码,你应该检查Array class sort(int [] a)方法。
我希望我的回答可以帮助你更好地了解这个世界。
再见,来自委内瑞拉的问候
PD。插入排序算法就是这个:
public static void insertionSort (int[] array) {
for (int i=1; i < array.length; i++) {
int aux = array[i];
int j;
for (j=i-1; j >= 0 && array[j] > aux; j--){
array[j+1] = array[j];
}
array[j+1] = aux;
}
}