题目
下列排序中哪个排序是不稳定排序 A.冒泡排序[1]B.简单选择排序[2]C.直接插入排序[3]D.折半插入排序
下列排序中哪个排序是不稳定排序
A.冒泡排序[1]
B.简单选择排序[2]
C.直接插入排序[3]
D.折半插入排序
题目解答
答案
A.冒泡排序算法稳定性 冒泡排序就是把小的元素往前调或者把大的元素往后调。 比较是相邻的两个元素比较,交换也发生在这两个元素之间。 所以,如果两个元素相等,是不会再交换的;如果两个相等的元素没有相邻,那么即使通过前面的两两交换把两个相邻起来,这时候也不会交换,所以相同元素的前后顺序并没有改变,所以冒泡排序是一种稳定排序算法[4]。不符合题意,错误。
B.简单选择排序是不稳定排序。当输入序列为30 30* 2 1 时,第一趟遍历会将30放到最后,第二趟遍历会将30放到到数第二个位置,最后所得的序列变为1 2 30 30(30*表示的意思在原序列中,其前方已经存在了一个30),由此我认为简单选择排序是不稳定的,相同关键字的记录在经过排序之后相对次序发生改变。符合题意,正确。
C.直接插入排序是稳定的算法,它满足稳定算法的定义。算法稳定性 -- 假设在数列中存在a[i]=a[j],若在排序之前,a[i]在a[j]前面;并且排序之后,a[i]仍然在a[j]前面。则这个排序算法是稳定的!不符合题意,错误。
D.折半插入排序算法是一种稳定的排序算法,比直接插入算法明显减少了关键字之间比较的次数,因此速度比直接插入排序算法快,但记录移动的次数没有变,所以折半插入排序算法的时间复杂度仍然为O(n^2),与直接插入排序算法相同。 附加空间O(1)。不符合题意,错误。
故根据以上分析正确答案是B,选择B。
解析
步骤 1:冒泡排序算法稳定性
冒泡排序是通过比较相邻的两个元素,如果前一个元素大于后一个元素,则交换它们的位置。由于冒泡排序在比较和交换时,只涉及相邻的两个元素,因此如果两个相等的元素在排序过程中没有被交换,它们的相对位置就不会改变。所以冒泡排序是一种稳定排序算法。不符合题意,错误。
步骤 2:简单选择排序算法稳定性
简单选择排序是通过遍历数组,找到最小的元素,然后将其与第一个元素交换,然后在剩余的元素中继续寻找最小的元素,直到整个数组排序完成。如果在排序过程中,两个相等的元素在排序前的相对位置发生了改变,那么简单选择排序就是不稳定的。符合题意,正确。
步骤 3:直接插入排序算法稳定性
直接插入排序是通过将一个元素插入到已排序的序列中,使整个序列保持有序。如果在插入过程中,两个相等的元素在排序前的相对位置没有改变,那么直接插入排序就是稳定的。不符合题意,错误。
步骤 4:折半插入排序算法稳定性
折半插入排序是通过二分查找法找到插入位置,然后将元素插入到已排序的序列中,使整个序列保持有序。如果在插入过程中,两个相等的元素在排序前的相对位置没有改变,那么折半插入排序就是稳定的。不符合题意,错误。
冒泡排序是通过比较相邻的两个元素,如果前一个元素大于后一个元素,则交换它们的位置。由于冒泡排序在比较和交换时,只涉及相邻的两个元素,因此如果两个相等的元素在排序过程中没有被交换,它们的相对位置就不会改变。所以冒泡排序是一种稳定排序算法。不符合题意,错误。
步骤 2:简单选择排序算法稳定性
简单选择排序是通过遍历数组,找到最小的元素,然后将其与第一个元素交换,然后在剩余的元素中继续寻找最小的元素,直到整个数组排序完成。如果在排序过程中,两个相等的元素在排序前的相对位置发生了改变,那么简单选择排序就是不稳定的。符合题意,正确。
步骤 3:直接插入排序算法稳定性
直接插入排序是通过将一个元素插入到已排序的序列中,使整个序列保持有序。如果在插入过程中,两个相等的元素在排序前的相对位置没有改变,那么直接插入排序就是稳定的。不符合题意,错误。
步骤 4:折半插入排序算法稳定性
折半插入排序是通过二分查找法找到插入位置,然后将元素插入到已排序的序列中,使整个序列保持有序。如果在插入过程中,两个相等的元素在排序前的相对位置没有改变,那么折半插入排序就是稳定的。不符合题意,错误。