希尔排序
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
以上是关于希尔排序的主要内容,如果未能解决你的问题,请参考以下文章