c - 选择排序——稳定

标签 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;
    }

如果我错了,请纠正我?

谢谢

最佳答案

您发布的代码似乎是一种稳定的排序。

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

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

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

关于c - 选择排序——稳定,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7889004/

相关文章:

c - 这是怎么回事?

c - 错误: '#' is not followed by a macro parameter

c - PAPI 和 native 事件

c++ - 使用 C/C++ 高效反序列化由 float 、标记和空行组成的字符串

c - 函数不断返回0

c - %u 需要 unsigned int 参数,但参数类型为 long int (4294967295)

c - 在线程之间划分工作? (并行线程)

c - 为什么这个 C 程序不能正常运行?

C bsearch 总是返回 pointer=NULL

c - 共享库 : Why muliple versions of GLIBC_ in a single binary