希尔排序的提出原因:
希尔排序是对插入排序的优化。
假设在插入排序中,有个最小元素位于排序序列最末尾,那么在排序过程中需要将该最小值一步一步地移动到序列的第一个位置,此时复杂度太高O(n^2),为了避免该类情况发生,给其设置了一个增量让其大步移动,优化其效率,此即为希尔排序。
希尔排序的基本思想:先取小于n的整数d1作为第一个增量,把全部记录分组。所有距离为d1倍数的记录放在同一组中,先在各组内进行直接插入排序;然后,去第二个增量d2<d1重复上述的分组和排序,直到所取的增量dt=1(dt<dt−1<…<d2<d1),即所有记录被放在同一组中进行直接插入排序为止。
希尔排序的时间复杂度与增量的设置有关,不稳定。
#include<iostream>
#include<vector>
using namespace std;
void shell_sort(vector<int>& nums)
{
int len=nums.size();
if(len<=1) return;
int increase=len;//增量
while(increase>1)
{
increase=increase/3+1;
for(int i=increase;i<len;i++)
{
int temp=nums[i];
if(nums[i]<nums[i-increase])
{
int j;
for(j=i-increase;j>=0 && nums[j]>temp;j=j-increase)
{
nums[j+increase]=nums[j];
}
nums[j+increase]=temp;
}
}
}
}
int main()
{
vector<int> nums{9,6,5,8,3,4,2,1,7};
shell_sort(nums);
for(int elem:nums) cout<<elem<<" ";
return 0;
}