算法介紹
希爾排序的實質就是分組插入排序,該方法又稱縮小增量排序,因 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