选择排序。如何选择排序为稳定算法?

时间:2012-10-28 19:55:04

标签: c++ algorithm sorting stable-sort

我有选择排序算法的这种实现。如何将此实现稳定下来?我认为这不可能/

int selection_sort1 ( int ai_numbers[], const int ci_count )
{
    int counter = 0;
    int i, minIndex, j;

    for ( i = 0; i < ci_count; i++ )
    {
        minIndex = i;
        for ( j = i + 1; j < ci_count; j++ )
        {
            if ( ai_numbers[j] < ai_numbers[minIndex] )
            {
                minIndex = j;
            }
        }
        swap ( &ai_numbers[i], &ai_numbers[minIndex] );
        counter++;
    }


    return counter;
}

2 个答案:

答案 0 :(得分:0)

您的实施不稳定。在每次迭代中,您将元素放在数组中的i位置,并将其放在剩余数组中的任意位置,这样就会搞乱原始顺序。

如果你想要稳定的排序,你必须:

  • 选择剩余列表中的最小元素
  • 在地点i插入而不进行交换。这意味着将剩余的元素向右移动,为您放置的i元素腾出空间。

这可确保具有相同值的元素放置在已排序数组和原始数组中的相同顺序中。

(感谢Groo在评论中指出错误)

答案 1 :(得分:0)

直接来自维基百科:

  
    
      

选择排序可以实现为稳定排序。如果不是在步骤2中交换,而是将最小值插入第一个位置(即,所有中间项向下移动),则算法是稳定的。但是,此修改要么需要支持有效插入或删除的数据结构,例如链接列表,要么导致执行Θ(n2)写入。

    
  

所以基本上你确实有一个稳定的排序,因为你总是交换一个小于最小值的值(而不是小于或等于该值)。