有关希尔排序算法叙述正确的是()。
A.最后一次的步长增量不一定为1
B.分割后子序列内部的排序算法是直接插入排序C.希尔排序是稳定排序算法
D.分割后子序列内部的排序算法是直接选择排序
解析:A.
B/D.希尔排序可以看做是一种改进的插入排序,通过分组减少逆序对数量,最终进行插入排序。
C.希尔排序在排序过程中可能会改变相同元素的相对位置,因此不是稳定的排序算法。
希尔排序的时间复杂度受增量序列影响,最坏情况下时间复杂度O(n^2),平均情况下时间复杂度接近O(n^1.3)。
- 直接选择排序:不稳定。在选择过程中,相等元素的相对顺序可能会被打乱
- 直接插入排序:稳定。插入排序在插入过程中,不会改变相等元素的相对位置
- 希尔排序:不稳定。是一种改进的插入排序,排序过程中,相等元素的相对顺序可能被打乱
- 快速排序:不稳定。基于分治法,划分过程中,相等元素的相对顺序可能被打乱
在给定四种当中,直接插入排序最稳定
思想
希尔排序又称“最小增量排序”,它是对插入排序的优化,基本思想是先将待排序序列分为若干子序列分别进行直接插入排序,待整个序列“基本有序”,在对全体进行一次直接插入排序。
希尔排序大概就是,选一组递减的整数作为增量序列(也就是步长)。最小的增量必须为1:DM>DM−1>...>D1=1DM>DM−1>...>D1=1
先用第一个增量把数组分为若干个子数组,每个子数组中的元素下标距离等于增量;
然后对每个子数组进行一次插入排序
再使用第二个增量,继续同样的操作,直到增量序列里的增量都使用过一次。
(增量为1时,就是对整个数组进行一次插入排序)



不断缩小增量直到增量为1,最后进行一次直接插入排序即可
void ShellSort(int* nums, int len)
{
int i, j, tmp;
for (int gap = len / 2; gap > 0; gap /= 2)
{
for (i = gap; i < len; i++)
{
tmp = nums[i];
for (j = i - gap; j >= 0 && nums[j] > tmp; j -= gap)
{
nums[j + gap] = nums[j];
}
nums[j + gap] = tmp;
}
}
}

1699

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



