选择算法是稳定的还是不稳定?

时间:2016-03-12 20:26:31

标签: algorithm

我有一个与选择排序算法有关的问题。

我有这个列表,每个项目都有一个名字和一个年龄。

<(>(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;
    }
}  

问题是算法是否稳定?如果它稳定,如何使其不稳定?

如果不稳定,如何使其稳定?

我发现这个列表不稳定。 我对么? 如果我错了,有人可以向我解释一下吗? 谢谢

3 个答案:

答案 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,因为您使用<=进行比较。苏将在鲍勃之前被移动,他们的相对顺序将会改变。

现在,如果您将比较更改为<,您将获得稳定的排序,因为两个被视为相等的对象不会更改相对位置。