排序算法 之 (希尔排序)

10.2、希尔排序

希尔排序的思想就是直接插入排序的升级版本;

把待排序的数组元素分为n个部分,对每个部分进行直接插入排序,然后把n减小继续重复,直到n=1时候,再进行n=1这一次就可以结束了。

注意:希尔排序不具备稳定性

希尔排序的图示

希尔排序的代码实现

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

#define boolean int
#define false 0;
#define true 1;

//希尔排序:nums:待排序数组,length:数组长度
boolean ShellSort(int nums[],int length){
    if(length == 0) return false;
    int temp;
    for(int d = length/2;d >= 1;d = d/2){//希尔排序的次数
        for(int i = d;i < length;i++){//每次排序
            if(nums[i-d] > nums[i]){
                temp = nums[i];
                int j;
                for(j = i-d;j >= 0 && temp < nums[j];j -= d ){//根据步长依次往后移动
                    nums[j+d] = nums[j];
                }
                nums[j+d] = temp;
            }
        }
    }
    
    return true;
}

int main(){
    int nums[] = {49,38,65,97,76,13,27};
    int length = 7;
    printf("希尔排序前:");
    for(int i = 0; i < length ;i++){
        printf("%d ",nums[i]);
    }
    ShellSort(nums,length);
    printf("\n");
    printf("希尔排序后:");
    for(int i = 0; i < length ;i++){
        printf("%d ",nums[i]);
    }

    return 0;
}

//结果:
希尔排序前:49 38 65 97 76 13 27 
希尔排序后:13 27 38 49 65 76 97 
posted @ 2023-03-15 18:10  水三丫  阅读(23)  评论(0编辑  收藏  举报