下列排序方法中,最坏情况下比较次数最少的是 A)冒泡排序

B)简单选择排序C)直接插入排序D)堆排序E快速排序
2024-12-02 04:29:16
推荐回答(3个)
回答(1):

最坏情况下比较次数最少的为D)堆排序:
A)冒泡排序 需要比较O(n^2)次(n(n - 1)/2次),即序列逆序的情况
B)简单选择排序,无论是否最坏都需要O(n^2)次(n(n - 1)/2次)
C)直接插入排序,最坏情况需要比较O(n^2)次(n(n - 1)/2次)
D)堆排序,无论是否最坏比较O(nlog2n)次
E)快速排序,最坏情况退化为冒泡排序,需要比较O(n^2)次(n(n - 1)/2次)

回答(2):

最坏情况下比较次数最少的为D)堆排序

延展回答:

A)冒泡排序 需要比较O(n^2)次(n(n - 1)/2次),即序列逆序的情况


B)简单选择排序,无论是否最坏都需要O(n^2)次(n(n - 1)/2次)


C)直接插入排序,最坏情况需要比较O(n^2)次(n(n - 1)/2次)


D)堆排序,无论是否最坏比较O(nlog2n)次


E)快速排序,最坏情况退化为冒泡排序,需要比较O(n^2)次(n(n - 1)/2次)

回答(3):

什么是交换排序呢?

交换排序:两两比较待排序的关键字,并交换不满足次序要求的那对数,直到整个表都满足次序要求为止。

算法思想

它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。

这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端,故名。

假设有一个大小为 N 的无序序列。冒泡排序就是要每趟排序过程中通过两两比较,找到第 i 个小(大)的元素,将其往上排。

以上图为例,演示一下冒泡排序的实际流程:

假设有一个无序序列 { 4. 3. 1. 2, 5 }

第一趟排序:通过两两比较,找到第一小的数值 1 ,将其放在序列的第一位。

第二趟排序:通过两两比较,找到第二小的数值 2 ,将其放在序列的第二位。

第三趟排序:通过两两比较,找到第三小的数值 3 ,将其放在序列的第三位。

至此,所有元素已经有序,排序结束。

要将以上流程转化为代码,我们需要像机器一样去思考,不然编译器可看不懂。

假设要对一个大小为 N 的无序序列进行升序排序(即从小到大)。

(1) 每趟排序过程中需要通过比较找到第 i 个小的元素。

所以,我们需要一个外部循环,从数组首端(下标 0) 开始,一直扫描到倒数第二个元素(即下标 N - 2) ,剩下最后一个元素,必然为最大。

(2) 假设是第 i 趟排序,可知,前 i-1 个元素已经有序。现在要找第 i 个元素,只需从数组末端开始,扫描到第 i 个元素,将它们两两比较即可。