八大排序算法(三) Shell排序

这里写图片描述
代码:

#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#define SIZE 10
int n[SIZE];

void init(int n[], int len){
    int i;
    srand((unsigned)time(NULL));
    for (i=0; i<len; i++){
        n[i] = rand()%10+1;
    }
}

void printout(int n[], int len){
    int i;
    for (i=0; i<len; i++){
        printf("%d ", n[i]);
    }
    printf("
");
}

void ShellSort(int n[], int len, int s){
    // n    要进行排充的数组
    // len  数组的长度
    // s    每次要递增的长度

    int i, j ,k;
    int tmp;
    for (k=s; k>0; k>>=1){
        // 分组排序, 每个数字都要用到
        for (i=k; i<len; i++){
            tmp = n[i];  // tmp 为 n[i]
            j = i-k;    //  j 为此段第一个首次的位置
            /* 组内排序, 将 temp 直接插入组合内合适的记录位置
                并不断地向前进行,向前插入
            */
            while (j>=0 && tmp < n[j]){
                n[j+k] = n[j];
                j -= k;
            }
            n[j+k] = tmp;
        }
    }

}


int main(){
    init(n, SIZE);
    printout(n, SIZE);
    ShellSort(n, SIZE, 4);
    printout(n, SIZE);
    return 0;
}

运行图:
这里写图片描述

原文地址:https://www.cnblogs.com/laohaozi/p/12538318.html