希尔排序,其实就是缩小增量的插入排序。
希尔排序算法分析:
将无序数组分割为若干个子序列,子序列不是逐段分割的,而是相隔特定的增量的子序列,对各个子序列进行插入排序;然后再选择一个更小的增量,再将数组分割为多个子序列进行排序……最后选择增量为1,即使用直接插入排序,使最终数组成为有序。
增量的选择:
在每趟的排序过程都有一个增量,至少满足一个规则 增量关系 gap[1] > gap[2] > gap[3] >..> gap[t] = 1 (t趟排序);根据增量序列的选取其时间复杂度也会有变化,这个不少论文进行了研究,在此处就不再深究;本文采用首选增量为n/2,以此递推,每次增量为原先的1/2,直到增量为1;
void ShellSort(vector<int> &num){
int length=num.size();
int tmp,j;
//gap从length/2开始,每次减半
for(int gap=length/2;gap>=1;gap/=2){
for(int i=gap;i<length;i++){
tmp=num[i];
//gap间隔插入排序
for(j=i-gap;j>=0 && num[j]>tmp;j-=gap){
num[j+gap]=num[j];
}
num[j+gap]=tmp;
}
}
}
写个类测试一下:
class TestShellSort {
public:
void main(){
vector<int> nums{3,5,2,8,4,7,8,9,10,12,11};
Solution s;
s.ShellSort(nums);
}
};
OK!!!