选择排序 - 稳定

时间:2011-10-25 12:05:06

标签: c

我读到它而不是交换,我们可以插入以将选择排序更改为稳定排序。我在网上得到了以下相同的实现。

void selection ( int a[], int n ) {
    while ( --n > 0 ) {
        int i, max = n;

        for ( i = 0; i < n; i++ ) {
            if ( a[i] >= a[max] )
                max = i;
        }

        if ( max != n ) {
            int save = a[max];

            for ( i = max; i < n; i++ )
                a[i] = a[i + 1];

            a[n] = save;
        }
    }
}

我不明白这将如何成为以下的稳定排序: (1,0),(2,0),(5,0),(4,0),(5,1)

我认为上面提到的实施将会给出 (1,0),(2,0),(4,0),(5,1),(5,0)

我不认为这是一种稳定的行为,因为我理解它。我对么。如果是这样,我怎样才能实现稳定的选择排序。

更改后的以下代码将为我们提供稳定的选择排序。如果我错了,请纠正我。

    for ( i = 0; i < n; i++ ) {
        if ( a[i] >= a[max] )
        max = i;
    }

我认为那条线不会给我们想要的结果,在这种情况下,它不会给我的排序数据提供稳定的结果。我认为以下代码会很好。

    for ( i = 0; i <= n; i++ ) {
        if ( a[i] >= a[max] )
        max = i;
    }

如果我错了,请纠正我?

由于

1 个答案:

答案 0 :(得分:1)

您发布的代码似乎是稳定的。

在选择循环中,将始终选择 last 出现的最大值。这是因为条件是a[i] >= a[max]而不是a[i] > a[max]

for ( i = 0; i < n; i++ ) {
    if ( a[i] >= a[max] )
    max = i;
}

然后将所选元素放在末尾(应该放置一个稳定的排序)。其余元素的顺序保持不变,因为它们都是移动而不是交换。这保证了具有相等值的元素将保持相同的顺序,即稳定的排序。