【算法百题之七】希尔排序,归并排序
大家好,我是Lampard~~
很高兴又能和大家见面了,接下来准备系列更新的是算法题,一日一练,早日升仙!
今天的问题是:
实现希尔排序以及归并排序。
一:希尔排序
- 时间复杂度
O(nlogn)~O(n^2) - 空间复杂度
O(1)
希尔排序的原理就是按照一定步长分成子序列进行排序,
然后逐步递减步长来完成最终排序。时间复杂度根据选择的步长相关。
代码算法图:

测试函数:

测试结果:

二.归并排序
- 时间复杂度
O(nlogn) - 空间复杂度
O(n) - 归并排序的原理就是将序列递归分成单位为1的小序列,然后两两合并排序,最终得到有序的序列。
具体流程看动图:

所以关键函数有两个:一个是归并,一个是递归
void Merge(vector<int> &theArray,int left,int right , int mid)
{
// 归并
int L = left; // 因为左右两边都是有序的,所以我们只需要对比后存入新向量中即可
int R = mid + 1;
int length = right - left + 1; // 长度
int flag = 0; // 新向量的下标
vector<int> result; // 定义一个新的向量来存储
while (L <= mid || R <= right)
{
if (L <= mid && R <= right)
{
if (theArray[L] <= theArray[R])
{
result[flag] = theArray[L];
flag++;
L++;
}
else
{
result[flag] = theArray[R];
flag++;
R++;
}
}
else if (L <= mid)
{
result[flag] = theArray[L];
flag++;
L++;
}
else if (R <= right)
{
result[flag] = theArray[R];
flag++;
R++;
}
}
for (int i=0; i < length; i++) // 把新向量的元素转移回就向量中
{
theArray[i+left] = result[i];
}
}
递归图:

结果:

本文详细介绍了希尔排序和归并排序的实现原理及步骤。希尔排序通过按一定步长分组排序,逐步减少步长完成排序,时间复杂度在O(nlogn)到O(n^2)之间。归并排序则采用递归方式将序列拆分为小序列再合并,时间复杂度稳定在O(nlogn)。

7889

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



