【算法百题之七】希尔排序,归并排序
大家好,我是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];
}
}
递归图:
结果: