希尔排序(C语言版)

//插入排序02 
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<math.h>
#define InitiaSize 10
int* Arr;               //定义增量序列 
typedef struct{
    int* data;
    int len;
    int MaxSize;
}SqList;
bool InitiaList(SqList &L){
    int len;
    printf("请输入线性表的长度:");
    scanf("%d",&len);
    while( len < 0){
        printf("输入长度不规范,请重新输入!\n");
        scanf("%d",&len);
    }
    if(len < InitiaSize){
        L.data = (int*)malloc(sizeof(int)*InitiaSize);
        L.len = len;
        L.MaxSize = InitiaSize;
    }
    else{
        L.data = (int*)malloc(sizeof(int)*(len + 1));
        L.len = len;
        L.MaxSize = len + 1;
    }
    printf("初始化完毕!\n");
    if((L.len == 0)||(L.MaxSize == 0)){
        printf("此线性表为空,无法进行随机赋值!\n");
        return false;
    }
    int i;
    srand(time(NULL));
    for(i = 1; i <= L.len; i++){
        L.data[i] = rand()%100;
    }
    printf("随机赋值完毕!\n");
    return true;
}
bool PrintList(SqList &L){
    if((L.len == 0)||(L.MaxSize == 0)){
        printf("此线性表为空,无法进行输出操作!\n");
        return false;
    }
    int i;
    for(i = 1; i <= L.len; i++){
        if(i == L.len){
            printf("%d\n",L.data[i]);
        }
        else{
            printf("%d ",L.data[i]);
        }
    }
    printf("此线性表输出完毕!长度是%d,最大容量是%d!\n",L.len,L.MaxSize);
    return true;
}
//希尔排序     快速排序的升级版    就多了一个增量序列 
void ShellSort(SqList &L){
    if((L.len == 0)||(L.MaxSize == 0)){
        printf("此线性表长度为空,无法进行希尔排序!\n");
        return ;
    }
    printf("请输入你想要创建的增量序列的长度:");
    int Alen;
    scanf("%d",&Alen);
    while(Alen < 1){
        printf("您输入的长度不规范,请重新输入!\n");
        scanf("%d",&Alen);
    }
    Arr = (int*)malloc(sizeof(int)*Alen);
    int i;
    for(i = 0; i < Alen; i++){
        Arr[i] = pow(2, Alen - i) - 1;
    }
    for(i = 0; i < Alen; i++){
        if(i == Alen - 1){
            printf("%d\n",Arr[i]);
        }
        else{
            printf("%d ",Arr[i]);
        }
    }
    printf("增量序列创建完毕!\n");
    printf("即将进入希尔排序!\n");
    int k, j;
    for(k = 0; k < Alen; k++){
        for(i = 1 + Arr[k]; i <= L.len; i++){
            if(L.data[i - Arr[k]] > L.data[i]){
                L.data[0] = L.data[i];
                j = i - Arr[k];
                while((j > 0)&&(L.data[j] > L.data[0])){
                    L.data[j + Arr[k]] = L.data[j];
                    j -= Arr[k];
                }
                L.data[j + Arr[k]] = L.data[0];
            }
        }
    }
    printf("希尔排序执行完毕!\n");
}
int main(){
    SqList L;
    InitiaList(L);
    PrintList(L);
    clock_t T;
    T = clock();                      //记录插入排序花费的时间 
    ShellSort(L);                     //进行希尔排序 
    T = clock();
    PrintList(L);
    printf("此次排序共耗时%lf s\n",((float)T)/CLOCKS_PER_SEC);
    return 0;
}

/*
希尔排序不稳定而且算法复杂度也比较高
还需要注意的是:希尔排序的增量序列数
最好都互为质数,并且希尔排序仅适用于
顺序表,链表不适合应用希尔排序 
*/

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值