我有一个与选择排序算法有关的问题。
我有这个列表,每个项目都有一个名字和一个年龄。
<(>(Tom 20)(Bob 10)(Pat 30)(Sue 10))如果我们按年龄(递增顺序)对列表进行排序。我们可以获得以下列表中的任何一个。
<(>(Bob 10)(Sue 10)(Tom 20)(Pat 30)) 要么 ((苏10)(鲍勃10)(汤姆20)(帕特30))这是给出
的方法public static void selectionSort(int [] arr)
{
final int n=arr.length;
int least,temp;
for(int i=0; i<n; i++)
{
least=i;
for(int j=i; j<n; j++)
if(arr[j]<=arr[least])
least=j;
temp=arr[i];
arr[i]=arr[least];
arr[least]=temp;
}
}
问题是算法是否稳定?如果它稳定,如何使其不稳定?
如果不稳定,如何使其稳定?
我发现这个列表不稳定。 我对么? 如果我错了,有人可以向我解释一下吗? 谢谢
答案 0 :(得分:1)
稳定排序是保留输入集的原始顺序的排序,其中比较算法不区分两个或更多项。
在你的例子中,这意味着Bob总是会在Sue之前来,因为这是输入集的原始顺序。
当两个元素相等时,不稳定算法表现出未定义的行为,有时很可能保留顺序。
由于行为未定义,即每次运行时都会得到不同的bob和sue命令,它确实会不稳定。
答案 1 :(得分:0)
对不起方法标题是 public static void selectionSort(int [] arr) { 至少,临时; final int n = arr.length;
其余的都在上面。
答案 2 :(得分:0)
@mikefaheysd更快,所以我不会重复他解释的内容。我将根据您的代码添加一些解释。
你需要弄清楚的是当对象相等时方法的行为是什么。目前,它是不稳定的,因为你使用它:
if(arr[j]<=arr[least])
least=j;
假设在某些时候Bob的索引是least
(因为他在输入数组中排在第一位)。当Sue出现时,她的索引现在为least
,因为您使用<=
进行比较。苏将在鲍勃之前被移动,他们的相对顺序将会改变。
现在,如果您将比较更改为<
,您将获得稳定的排序,因为两个被视为相等的对象不会更改相对位置。