【发布时间】:2013-12-20 22:42:46
【问题描述】:
在谈论算法时。我看到了对就地和稳定排序算法的描述。说算法是稳定的和说它就地一样吗?如果不是,有什么区别?
【问题讨论】:
-
示例 - 标准 quick-sort 就地且不稳定。
-
我不认为快速排序是就地的,它需要 O(logn) 额外的存储空间。
在谈论算法时。我看到了对就地和稳定排序算法的描述。说算法是稳定的和说它就地一样吗?如果不是,有什么区别?
【问题讨论】:
不,
稳定的算法意味着“相等”元素的相对顺序在算法执行后保持不变。
例如,如果你有一个数组
{-2, 4, 5, -11, 9, -10}
并且您想对其进行排序,以使所有负面元素都排在正面元素之前。并且您希望 -ve 和 +ve 元素的相对顺序保持不变
{-2, -11, -10, 4, 5, 9}
这是一个稳定算法的输出
如 cmets 中所述,就地算法意味着该算法不需要输入数据以外的额外空间。输出是数据在内存中占据与输入数据相同的位置,并且输入数据被销毁。
【讨论】:
稳定意味着输入元素的顺序保持不变,除非需要更改以满足要求。应用于相等元素序列的稳定排序不会改变它们的顺序。
就地意味着输入和输出占用相同的内存存储空间。没有将输入复制到输出,除非您制作了备份副本,否则输入将不复存在。这是一个通常需要命令式语言来表达的属性,因为纯函数式语言没有存储空间或覆盖数据的概念。
【讨论】:
不,不一样。
稳定 排序是这样一种排序,对于比较相等的元素,它们在排序输出中的相对位置保证与源中的相同。将此与不稳定的排序进行对比,其中比较相等的项目将以不可预测的顺序出现在排序结果中。这种区别在简单的情况下并不重要(例如,对整数进行排序),但当排序标准只是每个项目包含的数据的一部分时(例如,仅按尺寸对彩色袜子进行排序),它就变得很重要。
就地排序是一种无需额外空间即可对输入进行排序的方法;它也被称为“破坏性”排序,因为在排序后您丢失了输入数据的未排序形式(它已被排序数据替换)。
【讨论】:
destructive sort