希尔排序

算法介绍
希尔排序的实质就是分组插入排序,该方法又称缩小增量排序,因 DL.Shell 于1959 年提出而得名。

基本思想
先将整个待排元素序列分割成若干个子序列(由相隔某个“增量”的元素组成的) 分别进行直接插入排序,然后依次缩减增量再进行排序,待整个序列中的元素基本有序 (增量足够小)时,再对全体元素进行一次直接插入排序。因为直接插入排序在元素基 本有序的情况下(接近最好情况),效率是很高的,因此希尔排序在时间效率上比前三 种方法有较大提高。

案例
第一轮排序,如图
第一轮排序

//
//  希尔排序
//  Created by 刘龙玲 on 16/5/14.
//  Copyright © 2016年 liulongling. All rights reserved.
//
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define MAX 10

//打印函数
void PrintArray(int arr[], int length){
    for (int i = 0; i < length; i++){
        printf("%d ", arr[i]);
    }
    printf("\n");
}

//从小到大排序
void ShellSort(int arr[], int length){

    int a = length;
    int k = 1;

    while(a > 1)
    {
        //确定分组的增量
        a = a / 2;
        for(int i = 0; i < a;i++)
        {
            for(int j = i+a;j<length;j+=a)
            {

                int temp =arr[j];
                int x;
                for(x = j - a;x>=0&&arr[x] > temp;x=x-a)
                {
                    arr[x+a]=arr[x];
                }
                arr[x+a]=temp;

            }

        }
        printf("第%d轮排序结果:",k++);
        PrintArray(arr,MAX);
    }
}


int main(void){

    int arr[MAX] ={9,0,2,6,1,7,8,4,3,4};

    printf("%s \n","排序前");
    PrintArray(arr, MAX);
    ShellSort(arr, MAX);
    printf("%s \n","排序后");
    PrintArray(arr, MAX);
    return 0;
}

运行结果
排序前
9 0 2 6 1 7 8 4 3 4
第1轮排序结果:7 0 2 3 1 9 8 4 6 4
第2轮排序结果:1 0 2 3 6 4 7 4 8 9
第3轮排序结果:0 1 2 3 4 4 6 7 8 9
排序后
0 1 2 3 4 4 6 7 8 9

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值