希尔排序

来源:互联网 发布:淘宝网买汽车 编辑:程序博客网 时间:2024/06/05 14:59

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

0 0
原创粉丝点击