287、比较选择排序和插入排序在最坏情况、平均情况和最好情况下的运行时间。
时间复杂度分析
- 选择排序
- 最坏情况:二次方时间 $ O(n^2) $
- 平均情况:二次方时间 $ O(n^2) $
-
最好情况:二次方时间 $ O(n^2) $
-
插入排序
- 最坏情况:二次方时间 $ O(n^2) $
- 平均情况:二次方时间 $ O(n^2) $
- 最好情况:线性时间 $ O(n) $
288、展示插入排序每次迭代后以下数组的状态:5 19 13 36 23 2
初始数组:5 19 13 36 23 2;
第一次迭代后:5 19 13 36 23 2;
第二次迭代后:5 13 19 36 23 2;
第三次迭代后:5 13 19 36 23 2;
第四次迭代后:5 13 19 23 36 2;
第五次迭代后:2 5 13 19 23 36;
289、使用指针算术来打印数组 data 的第九个元素。请给出两种写法。
第一种:cout << data[8]; 第二种:cout << (data + 8)[0];
290、假设data是一个包含1000个整数的数组。编写一个函数调用,对从data[222]到data[321]的100个元素进行排序。
selectionsort(data + 222, 100);
291、哪种递归排序技术总是递归调用以对大小约为原始数组一半的子数组进行排序?
归并排序(Mergesort)
归并排序算法将数组在中点附近分割,通过递归调用对两个子数组进行排序,子数组大小约为原数组的一半。
292、比较归并排序和快速排序的运行时间。
归并排序和快速排序的平均运行时间均为 $ O(n \log n) $,但归并排序的最坏运行时间也是 $ O(n \log n) $,而快速排序的最坏运行时间是 $ O(n^2) $。
293、在快速排序中,如果所有递归调用都能对数组进行良好的“分割”,会得到怎样的时间性能?如果分割效果不佳,导致许多递归调用只能将数组大小减少一个,又会出现怎样的时间性能?
当所有递归调用都能对数组进行良好的“分割”时,快速排序的时间性能为 $ O(n \log n) $;如果分割效果不佳,许多递归调用只能将数组大小减少一个,时间性能为 $ O(n^2) $。
294、快速排序函数在数组已经有序时会产生最坏情况下的运行时间。假设你知道数组可能已经有序或几乎有序,你应该如何修改快速排序算法?
可以采用以下两种修改方式:
-
选择一个好的枢轴元素
常使用从数组中选三个值,取中间值作为枢轴元素的技术。为提高选到好枢轴元素的可能性,可随机选三个数组值。 -
切换排序策略
当子数组变小时(约15个元素)停止递归调用,用插入排序对这些小子数组排序。
295、堆排序算法与选择排序算法有哪些相似之处?又有哪些不同之处?
堆排序与选择排序的比较
相似之处
- 堆排序和选择排序都是通过反复交换数组元素对来工作。
- 除了存放待排序项的数组外,只需要少量固定的额外存储空间。
- 二者都采用类似策略,先定位最大元素,再定位次大元素,依此类推。
不同之处
- 堆排序使用更高效的算法来定位要移动的数组元素。
296、堆排序算法具有归并排序和快速排序算法的哪些特点?
堆排序结合了归并排序的时间效率和快速排序的存储效率。和归并排序一样,堆排序的最坏情况运行时间为 O(n log n) ;和快速排序一样,它不需要额外的数组。
297、分析选择排序(selectionsort)和插入排序(insertionsort)在最坏情况、平均情况和最好情况下的运行时间,并比较两种排序算法在部分排序数组上的性能特点。
时间复杂度对比
选择排序
- 最坏情况运行时间:二次方
- 平均情况运行时间:二次方
- 最好情况运行时间:二次方
插入排序
- 最坏情况运行时间:二次方
- 平均情况运行时间:二次方
- 最好情况运行时间:线性
- 当起始数组已经有序时,运行时间为线性
- 当起始数组接近有序时,算法运行较快
性能比较
- 插入排序在部分排序数组上表现更优
- 能够快速完成接近有序数组的排序
- 选择排序无论数组初始状态如何
- 需要进行固定次数的比较
- 需要进

最低0.47元/天 解锁文章

被折叠的 条评论
为什么被折叠?



