【问题标题】:How to reverse SelectionSort to display in descending order?如何反转 SelectionSort 以降序显示?
【发布时间】:2019-04-07 21:33:54
【问题描述】:

我正在尝试创建一个 selectionSort 方法来按降序排列值。此代码按升序排列它们。如何交换此代码以另一种方式排列。

public void selectionSort()
{
    int n = data.length;

    for(int index = 0; index < n-1; index++)
    {
        int min_idx = index;
        for(int j = index+1; j < n; j++)
            if(data[j] < data[min_idx])
                min_idx = j;

        int temp = data[min_idx];
        data[min_idx] = data[index];
        data[index] = temp;
    }
}

【问题讨论】:

标签: java sorting reverse selection-sort


【解决方案1】:

到目前为止,我能想到两种方法。我没有尝试过,但值得一试。

  1. 将所有数字乘以 -1 并应用原始选择排序进行升序排序。排序完成后,将所有数字乘以 -1 以返回 originwl 数字,但现在它们按降序排序。

  2. 尝试更改比较条件 如果(数据[j] 到 if(data[j] >= data[min_idx])

如果这些方法有问题,请告诉我。

【讨论】:

  • 第二种方法效果很好!感谢您的帮助!
  • 欢迎您@Christian。我很高兴它对您有所帮助。您能否将此答案标记为已接受?
【解决方案2】:

不要在每次迭代中选择最小的项目,而应该选择最大的项目。您真正需要做的就是将&lt; 条件更改为&gt;,但我也相应地更改了名称以使代码更易于理解:

public void selectionSort()
{
    int n = data.length;

    for(int index = 0; index < n-1; index++)
    {
        int max_idx = index; // max_idx instead of min_idx
        for(int j = index+1; j < n; j++)
            if(data[j] > data[min_idx]) // > instead of <
                max_idx = j;

        int temp = data[max_idx];
        data[max_idx] = data[index];
        data[index] = temp;
    }
}

【讨论】:

    【解决方案3】:

    为了解决这个问题,我建议你先重构你的代码。将swapfindMin 移动到单独的方法中:

    private static int getMin(int[] arr, int from, int to) {
        int min = from;
    
        for (int j = from; j < to; j++)
            min = arr[j] < arr[min] ? j : min;
    
        return min;
    }
    
    private static void swap(int[] arr, int i, int j) {
        int tmp = arr[i];
        arr[i] = arr[j];
        arr[j] = tmp;
    }
    

    在这里,您可能可以看到,ASCDESC 排序的实现是微不足道的:

    public static void selectionSortAsc(int[] arr) {
        for (int i = 0; i < arr.length - 1; i++)
            swap(arr, getMin(arr, i + 1, arr.length), i);
    }
    
    public static void selectionSortDesc(int[] arr) {
        for (int i = arr.length - 1; i > 0; i--)
            swap(arr, getMin(arr, 0, i + 1), i);
    }
    

    【讨论】:

      【解决方案4】:
      public static class SelectionSort
      {
          static int min;
          public static void Sort(int[] data)
          {
              for (int i = 0; i < data.Length; i++)
              {
                  for (int j = 0; j < data.Length; j++)
                  {
                      min = j;
                      if (data[i] < data[j])
                          Swap(x: ref data[i], y: ref data[min]);
                  }
              }
          }
      
          private static void Swap(ref int x, ref int y)
          {
              int temp = x;
              x = y;
              y = temp;
          }
      }
      
      For Ascending this line   
      if (data[i] < data[j])
      
      For Descending this line  
      if (data[i] > data[j])
      

      【讨论】:

        猜你喜欢
        • 2021-12-22
        • 1970-01-01
        • 2014-10-26
        • 2020-12-26
        • 1970-01-01
        • 1970-01-01
        • 2019-09-17
        相关资源
        最近更新 更多