2 回答
TA贡献1851条经验 获得超3个赞
你原来的算法是错误的。首先,if块应该与minPosition和进行比较,而maxPosition不是i。其次,如果您同时选择最小值和最大值,那么您的内部 for 循环应该停止在a.length - i, 不是a.length(因为顶部i元素也已排序)。两者都做给你这个作为升序算法。
public static void newSortMethod(int[]a){
for(int i = 0; i < a.length; i++){
int maxPosition=i;
int minPosition=i;
for(int j = i+1; j < a.length - i; j++){
if(a[j] < a[minPosition]){
minPosition = j;
}
if(a[j] > a[maxPosition]){
maxPosition = j;
}
}
swap(a,maxPosition,i);
swap(a,minPosition,a.length-i-1);
}
}
要切换到降序,只需添加一行。
public static void newSortMethod(int[]a){
for(int i = 0; i < a.length; i++){
int maxPosition=i;
int minPosition=i;
for(int j = i+1; j < a.length - i; j++){
if(a[j] < a[minPosition]){
minPosition = j;
}
if(a[j] > a[maxPosition]){
maxPosition = j;
}
}
swap(a,minPosition,maxPosition); // <-- this line
swap(a,maxPosition,i);
swap(a,minPosition,a.length-i-1);
}
}
TA贡献1824条经验 获得超6个赞
错误
首先,让我们查找代码中的问题。有一些,这在编程中经常发生。
您的代码仍在尝试使用 进行升序排序swap(a,minPosition,i),然后尝试将最大值放在最后,这不是您想要的:您想将最大值放在开头。
您n永远不会修改,因此您将继续打印0.
样品溶液
现在让我们看看一些有用的东西。我不完全确定您的升序选择排序是什么样的,但我想它应该是这样的:
public static void ascendingSortMethod(int[]a){
int n = 0; // this is only to count how many times the swap method was called
for(int i = 0; i < a.length-1; i++){
int minPosition = i;
for(int j = i+1; j < a.length; j++){
if(a[j] < a[minPosition]){
minPosition = j;
}
}
if(minPosition != i){ // check whether swap is necessary
swap(a,minPosition,i);
n ++;
}
}
System.out.println(n);
}
要使其按降序排序,只需切换比较运算符(minPosition为了清楚起见,可能还切换标识符)。
public static void newSortMethod(int[]a){
int n = 0; // this is only to count how many times the swap method was called
for(int i = 0; i < a.length-1; i++){
int maxPosition = i;
for(int j = i+1; j < a.length; j++){
if(a[j] > a[maxPosition]){ // switched comparison operator
maxPosition = j;
}
}
if(maxPosition != i){ // check whether swap is necessary
swap(a,maxPosition,i);
n ++;
}
}
System.out.println(n);
}
添加回答
举报