我无法按照所选的排序算法按字母顺序对数组中的字符串进行排序。我的代码就是一个完整的混乱。
public class sorting {
public void getArray(String [] a) {
int min = 0;
int minIndex = 0;
for (int j = 0; j < a.length; j++ ) {
for (int i = j; i < a.length; i++) {
if (i == j) {
a[min] = a[j];
}
if (a[min].compareTo(a[i]) < 0) { // if current element is < lowest, assign new lowest.
a[min] = a[i];
minIndex = i;
} // end of if
} // end of INSIDE for
a[minIndex] = a[j]; // place first element at the location of the smallest element.
a[j] = a[min]; // place the smallest element value in the first spot.
} // end of OUTSIDE for
}
任何人都能彻底向我解释他们在继续这个过程中的思考过程吗?例如,内部for循环对外部做了什么?提前谢谢了!
答案 0 :(得分:1)
非常简单地说,选择排序执行以下操作:
在步骤1和2之后,您知道最小的元素位于数组的第一个点。在步骤3中,您将查找第二个最小元素,如果您从第二个位置开始搜索,则该元素最小。
这是外循环的作用:找到第j个最小元素并将其与spot j中的元素交换。
现在,您如何找到数组中的最小元素?为此你需要内循环。您可以跟踪到目前为止最小的元素(以及找到它的索引),每当找到更小的元素时,都会更新当前最小的元素(以及找到它的索引)。
您的代码中有两个错误:
a[min]
,而不是使用min
,因此您需要将类型更改为String
。a[i]
是否小于min
,而不是相反。
if (i == j) {
min = a[j];
}
if (a[i].compareTo(min) < 0) {
min = a[i];
minIndex = i;
}
最后:
a[minIndex] = a[j];
a[j] = min;
答案 1 :(得分:0)
当然,我可以帮你解释一下。首先,我会做一些重构,让我更容易解释。它在逻辑上等同于您使用重命名的变量发布的代码,并且某些逻辑拆分为第二个方法而不是内部和外部循环。
此方法遍历字符串,并为每个条目调用swapMinFromIndex
public void sortStrings(String[] strings) {
for (int i = 0; i < strings.length; i++)
swapMinFromIndex(strings, i);
}
此方法首先假设第一个元素是最小的。然后它通过剩余的元素,如果任何小于当前最小的元素,它存储它们的索引。最后,它将最小的与第一个交换(除非它们是相同的)。
private void swapMinFromIndex(String[] strings, int start) {
int indexOfMin = start;
for (int i = start + 1; i < strings.length; i++) {
if (strings[i].compareTo(strings[indexOfMin]) {
indexOfMin = i;
}
}
if (indexOfMin != start) {
String tmp = strings[start];
strings[start] = strings[indexOfMin];
strings[indexOfMin] = tmp;
}
}
因此,这两种方法一起寻找最小元素并将其交换到位。