【问题标题】:How to reverse selection sort如何反转选择排序
【发布时间】:2015-12-14 14:02:40
【问题描述】:

我正在尝试从高到低编写此选择排序,但我不太确定该怎么做。我对排序算法很陌生。

public  void selectionSort(String[ ] data){
    // for each position, from 0 up, find the next smallest item 
    // and swap it into place
    for (int place=0; place<data.length-1; place++){
        int minIndex = place;
        for (int sweep=place+1; sweep<data.length; sweep++){
            if (data[sweep].compareTo(data[minIndex]) < 0)
                minIndex=sweep;
        }
        swap(data, place, minIndex);
    }
}

我之所以尝试更改它的原因是,这里的选择排序会遍历数组的其余部分,寻找最小值然后将其交换到前面。我想更改算法,以便它还在剩余部分中寻找最大值,并将其交换到后面,以便同时从前面和后面构建一个排序列表。

所有帮助将不胜感激:)

【问题讨论】:

  • 什么意思?降序?
  • @SleimanJneidi 是的,降序
  • 我相信只有改变 - if (data[sweep].compareTo(data[minIndex]) &gt; 0)
  • @SubhrajyotiMajumder 所以它与 for 循环无关?
  • 是的,比较是排序的关键。

标签: java algorithm sorting selection-sort


【解决方案1】:

你只需要否定compareTo方法

if(data[sweep].compareTo(data[minIndex]) > 0)
    minIndex=sweep;

【讨论】:

  • 所以它与forloops无关?
  • 不,一切都保持不变,但不是大于你使用小于
  • 所以我在这里要解决的问题是标准算法遍历数组的剩余部分,寻找最小值,然后将其交换到前面。改变算法,让它也在剩余部分中寻找最大值,并把它交换到后面,这样它就可以同时从前面和后面建立一个排序列表。这种方法可以做到这一点吗? @SleimanJneidi
【解决方案2】:

选择排序在每次迭代中找到最小的剩余项目并放在正确的位置。相反,您希望找到剩余的最大项。最简单的方法是翻转选择条件。而不是:

if (data[sweep].compareTo(data[minIndex]) < 0)

你应该使用:

if (data[sweep].compareTo(data[minIndex]) > 0)

【讨论】:

  • 哦,好吧,我试过了,我认为它有效。对无序集进行排序是否比升序时更慢?
  • 我有一个检查数组是否有序的方法,它说不是?我真的很困惑
  • @NandaArdianto 让我们在每个帖子中保留一个问题。请有一个包含该方法代码的新帖子?
猜你喜欢
  • 1970-01-01
  • 2017-09-20
  • 1970-01-01
  • 1970-01-01
  • 2011-12-03
  • 1970-01-01
  • 1970-01-01
  • 2013-04-25
  • 2022-11-11
相关资源
最近更新 更多