希尔排序和C代码讲解

希尔排序实际的C代码讲解

1.希尔排序原理

希尔排序用于将数组内元素进行排序,方法是设置“跨度”将数组进行分组

 

假设上面是待排数组,那么怎么进行排序呢?首先确定“跨度”gap,初始的gap等于数组长度的一半,之后gap等于源gap的一半,它代表的是将待排数组分割为多少组。比如图里待排元素有12个,那么初始gap就为6,就是说将12个元素分为6组。那么希尔排序的思想就是每次将一个元素以及每个相隔gap的元素作为一组,对每组的元素先进行排序,每次排序后将gap减小,知道将数组化为有序。

2.代码讲解

希尔排序实际代码的关键是写好三个循环。

第一层循环是将待排数组的元素进行分组。

for (gap = length / 2; gap >= 1;gap = gap/2) { // 分组的次数

}

第二层循环是对应gap所分组的组数。

for(i = gap; i < length; i ++) { // 每组遍历 

}

第三层循环是为了对每组元素进行排序。

for (j = i - gap; j >= 0 && temp < data[j];j = j - gap) { //组内排序

}

实际的工作流程就是:假入是将待排数组用希尔排序排列为升序序列,每次将待排数组分好组后,第三层循环从后向前判断此元素和组内前一个元素(即前面相隔gap个元素的元素),如果前面大后面小,则交换位置。完成这一组的排序后,第二层元素负责换组,对应指针指向的元素向后移动到后一个元素(这里就是另一组元素的比较了)。

整体的一个代码如下:

int shell_sort(int *data, int length) {

    int gap = 0; //分组的跨度
    int i = 0, j = 0;

    for (gap = length / 2; gap >= 1;gap = gap/2) { // 分组的次数

        for(i = gap; i < length; i ++) { // 每组遍历 

            int temp = data[i];
            for (j = i - gap; j >= 0 && temp < data[j];j = j - gap) { //组内排序

                data[j+gap] = data[j];

            }

            data[j+gap] = temp;
        }

    }
    return 0;
}

主函数:

int main(){

    int i=0;
    int data[DATA_ARRAY_LENGTH] = {23, 64, 24, 12, 9, 16, 53, 57, 71, 79, 87, 97};

    shell_sort(data,DATA_ARRAY_LENGTH);

    for(i = 0;i<DATA_ARRAY_LENGTH;i++){
        printf("%4d",data[i]);
    }
    printf("\n");

}

希望对读者有帮助哈哈

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值