希尔排序

原创
2013/06/11 13:43
阅读数 126

1 排序思想:

第1趟:取一正整数d1(d1<n)作为第一个增量,对所有间隔为d1的记录进行直接插入排序。例如,对{a[k],a[k+d1],a[k+2d1],……}执行直接插入排序,其中,k=0,1,2,……,d1-1
第2趟:取一正整数d2(d2<d1),重复上一步的操作
直到所取的增量为1

例如,原始数据:

第1趟排序,取增量为5,如上图,颜色相同的在同一组,对每组进行直接插入排序:

第2趟排序,取增量为3,如上图,颜色相同的在同一组,对每组进行直接插入排序:

第3趟排序,取增量为1,即对上一步的结果进行直接插入排序:

2 算法实现:

// 根据增量序列dk[]对num[]进行希尔排序
void shell_sort(int num[],int num_len,int dk[],int dk_len){
    int k;
    for(k=0;k<dk_len;k++)
        shell_pass(num,num_len,dk[k]);
}
// 根据增量d对num[]进行一次希尔排序
// 即对所有间隔为d的记录进行直接插入排序
void shell_pass(int num[],int num_len,int d){
    int i,j,k,key;
    for(i=d;i<num_len;i++){
        // 将num[i]插入到指定位置
        key=num[i];
        j=i-d;
        while(j>=0&&num[j]>key){
            num[j+d]=num[j];
            j-=d;
        }
        num[j+d]=key;
    }
}

3 性能分析:

3.1 空间复杂度:如上代码,仅在交换数据时使用一个辅助空间,空间复杂度是O(1)

3.2 时间复杂度:O(nlogn)-O(n^2)

3.3 稳定性:不稳定

展开阅读全文
加载中
点击引领话题📣 发布并加入讨论🔥
打赏
0 评论
3 收藏
0
分享
返回顶部
顶部