3、希尔排序
-
希尔排序就是分组的插入排序,每一轮都会把数组分成不同的组,然后在组内进行插入排序。分组是根据数的距离划分的。比如第一轮距离d=n/2,第二轮d=n/4……,到最后d=1,从而彻底完成排序。
-
稳定性:由于希尔排序是分组进行的,相等的数可能位于不同的组中,它们的相对位置可能会发生变幻,所以不稳定。
-
时间复杂度:O(n1.3)~O(n2),空间复杂度:O(1),原地排序
-
代码:
#include<iostream>
#include<vector>
using namespace std;
void ShellSort(vector<int> &a)
{
int d, i, j;// 定义间距d、当前元素i、指向前面序列的指针j
for ( d = a.size() / 2; d >= 1; d /= 2)// d从n/2开始,每次除以2,直到d=1
for (int i = d; i < a.size(); i++)// i从第一组的第二个元素开始(因为是插入排序,都是从第二个元素开始)
{
if (a[i] < a[i - d])// 如果当前元素小于先前序列的末尾元素
{
int x = a[i];// 记录当前元素
j = i - d;// 用指针j指向那个末尾元素
a[i] = a[j];// 把那个末尾元素往后移d个单位,也就是移到了i的位置上(注意,此时a[i]被a[j]覆盖了)
j -= d;// j再向前移动d个单位,指向一组内倒数第二个元素
while (j >= 0 && x < a[j])// 和插入排序一致
{
a[j + d] = a[j];//后移
j -= d;//向前遍历
}
a[j + d] = x;//j指向的是末尾元素,我们要在末尾元素的后一个位置插入,即在j+d处
}
}
}
int main()
{
vector<int> nums = {6,5,3,4,1,2};
ShellSort(nums);
for (int i = 0; i < nums.size(); i++)
{
cout << nums[i] << " ";
}
}