关于排序算法比较的问题

2024-12-16 06:35:14
推荐回答(2个)
回答1:

楼上的说法不准确吧,不能说比较和交换的次数不是一个级别的,交换也不是最多只有n次。比如一个逆序的数组进行升序的冒泡排序,交换就远远超过n次。
但是假设比较次数为P(n),交换次数为Q(n),那么因为交换发生在比较之后(基本上排序算法都是这样,楼主可以自己想想),必然有Q(n)<=P(n)。如果时间复杂度为T(n),那么显然根据时间复杂度的定义(极限定义),用大O表示法可以忽略Q(n)项(或用P(n)代替Q(n)),仅用P对T进行表示。
因为大O表示法是对时间复杂度上限的一个估计,而这种每比较一次就需要交换的情况确实存在(最差情况),所以在T(n)中使用P(n)对Q(n)进行替换并不会扩大对上限估计,而只是乘以了系数2,在大O表示法中常数项是不写入的。
这些数学分析一般在国内的算法教材中都不写入的,MIT的《ITA》注重这方面的叙述。
关于总结其实楼主可以自己去搜,上来问这行为太懒了。不过我也帮你找来吧。

冒泡法:
这是最原始,也是众所周知的最慢的算法了。他的名字的由来因为它的工作看来象是冒泡: 复杂度为O(n*n)。当数据为正序,将不会有交换。复杂度为O(0)。
直接插入排序:O(n*n)
选择排序:O(n*n)
快速排序:平均时间复杂度log2(n)*n,所有内部排序方法中最高好的,大多数情况下总是最好的。
归并排序:log2(n)*n
堆排序:log2(n)*n
希尔排序:算法的复杂度为n的1.2次幂

回答2:

因为交换的次数与比较的次数不是一个级别的,比如
冒泡排序,
要比较n + (n - 1)+。。。。。+2+1次(大概是这样),而交换最多只有n次