希尔排序-ShellSort

来源:互联网 发布:lol域名 发展 编辑:程序博客网 时间:2024/06/06 02:38

希尔排序,其实就是缩小增量的插入排序。

希尔排序算法分析:

将无序数组分割为若干个子序列,子序列不是逐段分割的,而是相隔特定的增量的子序列,对各个子序列进行插入排序;然后再选择一个更小的增量,再将数组分割为多个子序列进行排序……最后选择增量为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!!!

0 0
原创粉丝点击