算法学习之希尔排序

 

算法学习之希尔排序:

希尔排序是在插入排序的基础之上,优化了时间效率而开发出来的排序算法,其讲普通直接插入排序的O(n*n)的时间复杂度降为了O(nlogn)的时间复杂度,是第一个打破n*n时间复杂度的算法。因此我们有必要好好学习一下这个算法,掌握它的思想。
主要思想:
希尔排序算法通过间隔值划分,将待排序数组分为了几个逻辑上的序列,如下:
间距值为k,待排序数组为A[n],通过间隔值,将数组分为
A[1] A[1+k] A[1+2k] ... 
A[2] A[2+k] A[2+2k] ...
...
A[k] A[2k]  A[3k] ...
其中间距值是变化的,一般取n/2,n/4,n/8,...
当每取一个间距值时,就会生成k个逻辑上的序列,而算法的主要目的就是将待排序数组分为几个逻辑序列后,再对每一个逻辑上的序列进行一次直接插入排序。
这样做,可以使得整个待排序序列趋向于已排好序的序列,而我们知道已拍好序的序列排序时间复杂度为n。因此希尔排序实质上是从宏观上对待排序数组进行调整,对每个组进行直接插入排序,从而达到使得数组趋向于已拍好序的数组来达到提高时间效率的目的。
代码如下:
 

#include<stdio.h>
#include<stdlib.h>
#include<time.h>

int A[20];
int main(){
    srand((unsigned)(time(NULL)));      //设置随机数种子
    for(int i = 0; i < 20;i++){
        A[i] = rand() % 100;
    }

    int k, j, i;
    k = 20 / 2;
    while(k > 0){
        for(i = k; i < 20;i++){
            int tem = A[i];
            for(j = i-k;j >= 0 && A[j] > tem; j-=k)A[j+k] = A[j];
            A[j+k] = tem;
        }
        k /= 2;
    }

    for(int i = 0;i < 20;i++){
        printf("%d ",A[i]);
    }
    return 0;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值