选择排序.如何进行选择作为稳定算法
Selection sort. How to do selection sort as stable algorithm?
我具有选择排序算法的这种影响。如何将此实现作为稳定?我认为不可能/
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;
}
直接从Wikipedia拿走:
选择排序可以作为稳定的排序实现。如果将最小值插入第一个位置(即,所有中间项目向下移动)而不是交换步骤2,则该算法是稳定的。但是,此修改需要支持有效插入或删除(例如链接列表)的数据结构,或者导致执行θ(n2)写入。
因此,基本上您确实有稳定的排序,因为您总是换成最小值较小的值(而不是较少或等于值)。
您的实现不是稳定的。在每次迭代中,您将元素处于数组中的位置i
,并将其放在其余数组中的任意位置,因此您弄乱了原始订单。
如果您想要稳定的排序,则必须:
- 按照您已经完成的剩余列表,选择最小元素
-
插入它在
i
的位置而无需交换。这意味着将剩余元素移至您要放置的i
元素的空间的权利。
这可以确保具有相同值的元素在相同顺序中放置在排序的数组和原始数组中。
(感谢Groo在评论中指出错误)
相关文章:
- C++选择排序算法中的逻辑错误
- 为什么这个选择排序算法仍然切换一个元素,当它已经是其他元素中最小的元素时?
- 如何使用cpp编写选择排序算法以降序对元素列表进行排序?
- 对于这个问题,是否有更好的数据结构和算法选择
- 使用opencv在受控环境中进行视频跟踪的跟踪标记和跟踪算法选择
- 选择排序算法生成无序结果
- std::stable_sort: 如何选择内存优化算法而不是时间优化算法?
- 最小 kth 用于快速选择算法
- 我的Dijkstra算法没有选择短路径
- 我如何在C 中制作算法,以在不重复的情况下查找集合的变化(即n元素,选择k)
- 为什么我的中位数快速选择算法segfault
- 快速选择算法因元素重复而失败
- 使用选择算法编译时递归排序
- 快速选择算法
- 我的快速选择算法未返回正确的值
- 根据组合框中的选定项目选择算法
- 来自 SRM 489 DIV 2 (500 pt) 的 TopCoder 最优选择算法
- 就地随机选择算法
- 快速选择算法
- 不能理解快速选择算法