我正在阅读Robertsedwick的C ++排序算法
属性1:插入排序和冒泡排序使用线性数字 最多为常数的文件的比较和交换 对应于每个元素的反转。
在另一种类型的部分排序文件中,我们可能已将一些元素附加到已排序的文件中,或者已在已排序的文件中编辑了一些元素以更改其kesy。 Insetion sort是这类文件的有效方法;泡沫和选择排序不是。
属性2:插入排序使用线性数量的比较和 交换具有最多恒定数量元素的文件 不止一定数量的相应倒置。
我对上述属性的疑问是
我无法区分属性1和属性2?任何人都可以在这里解释一下吗?
基于什么基础,属性2作者提到插入排序最好而不是冒泡和选择排序?
如果用例子解释会很好。
感谢您的时间和帮助
答案 0 :(得分:3)
因此,排序顺序为<
的倒置有i < j
但a[i] > a[j]
。
属性1.考虑序列2 1 4 3 6 5 8 7 10 9...
。每个元素相对于左边或右边的邻居都是乱序的,但是对于所有其他元素是有序的。因此,在这种情况下,每个元素具有恒定数量的反转。此属性表示所有元素都可能有点乱序。
冒泡排序和插入排序都将以线性时间运行。冒泡排序只需要一次通过即可更正订单,因为它会交换相邻元素,另一次通过确认。插入排序只需要对每个元素进行一次比较和交换。
属性2.此属性更强。除了能够使所有元素有点乱,现在你可以有一些非常不正常。考虑与之前相同的序列,但最小元素和最大元素移动到相反的末端:n 2 4 3 6 5 8 7 10 9...1
。现在1
和n
与所有其他元素相关。
插入排序仍将以线性时间执行。和以前一样,大多数元素只需要进行一些比较和交换,但有一些元素可以进行n
比较和交换。在此示例中,第一个n-1
元素需要进行一些比较和交换(确定,因此2
只需要一个)到位,最后一个需要进行n-1
比较和交换 - - 2*(n-1) + 1*(n-1)
是订单n
。
在这个例子中冒泡排序要困难得多。每次传递只能向后移动1
一步。因此,在完成之前至少需要进行(n-1)
次(n-1)
次通过(n-1)*(n-1)
次传递 - 这是乘法n^2
是次序{{1}}。 (你也可以在相反的方向上进行冒泡排序,在这种情况下,开头的最大元素会慢慢移动到另一端。)