希尔排序

Posted 程序员小毛驴

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了希尔排序相关的知识,希望对你有一定的参考价值。

算法介绍
希尔排序的实质就是分组插入排序,该方法又称缩小增量排序,因 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

以上是关于希尔排序的主要内容,如果未能解决你的问题,请参考以下文章

希尔排序

排序之希尔排序

希尔排序

希尔排序

希尔排序

希尔排序温习