字符串的选择排序算法

时间:2015-02-12 05:59:53

标签: java algorithm sorting

我无法按照所选的排序算法按字母顺序对数组中的字符串进行排序。我的代码就是一个完整的混乱。

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循环对外部做了什么?提前谢谢了!

2 个答案:

答案 0 :(得分:1)

非常简单地说,选择排序执行以下操作:

  1. 找到最小的元素
  2. 用第一个元素交换
  3. 找到第二个最小的元素
  4. 用第二个元素交换
  5. ...(依此类推)
  6. 在步骤1和2之后,您知道最小的元素位于数组的第一个点。在步骤3中,您将查找第二个最小元素,如果您从第二个位置开始搜索,则该元素最小。

    这是外循环的作用:找到第j个最小元素并将其与spot j中的元素交换。

    现在,您如何找到数组中的最小元素?为此你需要内循环。您可以跟踪到目前为止最小的元素(以及找到它的索引),每当找到更小的元素时,都会更新当前最小的元素(以及找到它的索引)。


    您的代码中有两个错误:

    1. 当您跟踪数组的最小元素时,您将覆盖输入的元素。您应该始终使用a[min],而不是使用min,因此您需要将类型更改为String
    2. 您应该检查a[i]是否小于min,而不是相反。
    3. 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;
    }
}

因此,这两种方法一起寻找最小元素并将其交换到位。