MergeSort 实现稳定性
MergeSort Implementation Stability
mergesort的实现会影响其稳定性吗?
比如我们用数组来实现归并排序,是不是不如链表实现归并排序稳定?
数组或链表的合并排序的自上而下(递归)和自下而上(迭代)实现的大多数实现都是稳定的。关键因素在合并函数,只要合并函数在"right"个元素之前移动相等的"left"个元素,它就会稳定。比较可以是 "left" element <= "right" element 或者在 C++ 标准库的情况下,它只使用 less than 进行比较,它的比较是 "right" element < "left"元素,所以如果 "left" 元素是 <= "right" 元素,它会被移动。
另一个可能的问题是混合归并排序,它对一小组元素使用了不稳定的排序方法。
一般来说,交换相邻元素的排序(如冒泡排序)通常是稳定的,而交换非相邻元素的排序(如快速排序)通常不稳定。
合并排序应该对它们都稳定。您使用列表还是数组更多地取决于您使用它的目的。
如果排序方法保持数组中具有相同键的元素的相对顺序,则它是稳定的。
自上而下和自下而上的实现都是稳定的方法。它独立于数组或链表。
mergesort的实现会影响其稳定性吗?
比如我们用数组来实现归并排序,是不是不如链表实现归并排序稳定?
数组或链表的合并排序的自上而下(递归)和自下而上(迭代)实现的大多数实现都是稳定的。关键因素在合并函数,只要合并函数在"right"个元素之前移动相等的"left"个元素,它就会稳定。比较可以是 "left" element <= "right" element 或者在 C++ 标准库的情况下,它只使用 less than 进行比较,它的比较是 "right" element < "left"元素,所以如果 "left" 元素是 <= "right" 元素,它会被移动。
另一个可能的问题是混合归并排序,它对一小组元素使用了不稳定的排序方法。
一般来说,交换相邻元素的排序(如冒泡排序)通常是稳定的,而交换非相邻元素的排序(如快速排序)通常不稳定。
合并排序应该对它们都稳定。您使用列表还是数组更多地取决于您使用它的目的。
如果排序方法保持数组中具有相同键的元素的相对顺序,则它是稳定的。
自上而下和自下而上的实现都是稳定的方法。它独立于数组或链表。