希尔排序:(在直接插入排序的基础上进行分组插入排序)
问题:给定一个无序数组,要求进行排序(从小到大)
思路:1.首先设置一个初始值gap=n/2;将数组分成gap组
2.每组的数值则为a[0]/a[1]/a[2].....a[0+1*gap]/a[1+1*gap]/a[2+1*gap].....直到下标越界
3.将每组数据进行直接插入排序
4.将gap缩进为gap/2;分组插入,当gap为1时直接插入完成数组排序
主要代码如下(C++):
1.分组代码:
void gaps(vector<int> &nums,int len)
{
//设置gap分组初始值为len/2,循环更新gap为gap/2直到gap为1
for(int gap=len/2;gap>=1;gap=gap/2)
{
for(int i=0;i<gap-1;i++)//对每组进行直接插入排序
{
straightSort(nums,len,i,gap);
}
}
}
2.插入代码:
void straightSort(vector<int>&nums,int len,int start,int gap)
{
int j=start;//第start组
int temp=0;//无序区第一个元素
for(int i=start+gap;i<len;i=i+gap)
{
temp=nums[i];
for(j=i-gap;j>=0 && nums[j]>temp;j=j-gap)
{
nums[j+gap]=nums[j];
}
nums[j+gap]=temp;
}
}
空间复杂度:O(1)
时间复杂度:
1.平均O(N^1.3)
稳定性:不稳定
原因:相等的两个元素,排序后,相对位置会出现变化。