希尔排序(C语言简单实现)

希尔排序是直接插入排序的升级版,直接插入排序每次增量是1,但希尔排序的增量increment比1大,也就是说直接插入排序是一个一个比较的,但是希尔排序是跳着来的,从而实现顺序表的基本有序,如果对直接插入排序不了解的可以看下我的另一篇文章:直接插入排序,看懂了直接插入排序再回来看希尔排序就很简单了。

/* 顺序表L作希尔排序 */
void ShellSort(SqList *L){int i, j;int increment = L->length;do{increment = increment/3+1;        //增量序列for(i=increment+1;i<=L->length;i++){if(L->r[i] < L->r[i-increment]){  //需将L->r[i]插入有序增量子表L->r[0] = L->r[i]; //暂存在L->r[0]for(j=i-increment; j>0 && L->r[0] < L->r[j];j-=increment)L->r[j+increment] = L->r[j];      //记录后移,查找插入位置L->r[j+increment] = L->r[0];    //插入}}}while(increment > 1);
}

复杂度分析

希尔排序的关键并不是随便分组后各自排序,而是将相隔某个“增量”的记录组成一个子序列,实现跳跃式的移动,使得排序的效率提高。

这里“增量”的选取就很关键了,大量研究表明,当增量序列为 dlta[k] = 2^(t-k+1)-1(0<=k<=t<=(log2(n+1)))时,可以获得不错的效率,时间复杂度为O(n^(3/2)),比直接排序效率高。需要注意的是,增量序列的最后一个增量值必须等于1才行 。同时,因为记录时跳跃式的移动,所以希尔排序不是一种稳定的排序算法。

例子

#include <stdio.h>
#include <stdlib.h>
#define MAXNUM 11struct SqList{int r[MAXNUM];int length;
};/* 希尔排序 */
void ShellSort(SqList* L){int i, j;int increment = L->length;do{increment = increment/3;for(i=increment+1;i<=L->length;i++){if(L->r[i] < L->r[i-increment]){   //L->r[i]为需要插入顺序表的数 L->r[0] = L->r[i];for(j=i-increment;j>0 && L->r[0] < L->r[j];j-=increment)  //跳着排序 L->r[j+increment] = L->r[j];L->r[j+increment] = L->r[0];}}}while(increment > 1);  //增量为1时退出,因为1的时候变成了直接插入排序了
}int main(){int i;SqList* L = (SqList*)malloc(sizeof(SqList));L->length = MAXNUM;int a[11] = {5,9,7,8,1,4,3,0,6,2,10};    //第一位是哨兵 for(i=0;i<MAXNUM;i++)L->r[i] = a[i];ShellSort(L);for(i=0;i<MAXNUM;i++)printf("%d ",L->r[i]);printf("\n");return 0;
}

结果

希尔排序(C语言简单实现)相关推荐

  1. 数据结构(八):排序 | 插入排序 | 希尔排序 | 冒泡排序 | 快速排序 | 简单选择排序 | 堆排序 | 归并排序 | 基数排序 | 外部排序 | 败者树 | 置换-选择排序 | 最佳归并树

    文章目录 第八章 排序 一.排序的基本概念 (一)什么是排序 (二)排序的应用 (三)排序算法的评价指标 (四)排序算法的分类 (五)总结 二.插入排序 (一)算法思想 (二)算法实现 (三)算法效率 ...

  2. 希尔排序 C语言实现

    希尔排序 希尔排序( Shell's Sort)又称"缩小增量排序"( Diminishing Increment Sort),是插入排序的一种, 因D.L.Shell 于1959 ...

  3. 希尔排序c语言,希尔排序(C/C++实现)

    封装成函数: //交换数组元素 void swap(int *a,int i,int j) { int t = a[i]; a[i] = a[j]; a[j] = t; } //希尔排序 void s ...

  4. 希尔排序(c语言实现)

    插入排序的一个弊端,就是在插入过程中,我们是将后面的元素依次与前面的元素按照从后往前的顺序比较,一旦一个很小的元素在序列最后,那么它要比较的次数就会很多,这个问题在希尔排序中得到了解决. 希尔排序思路 ...

  5. matlab实现希尔排序,C语言希尔排序算法

    用希尔排序法对一组数据由小到大进行排序,数据分别为 69.56.12.136.3.55.46. 99.88.25. 实现过程: (1)自定义函数 shsort(),实现希尔排序. (2) main() ...

  6. 图解希尔排序——希尔排序算法(shell sort)

    希尔排序 shell sort 算法图解 算法实现(C语言) 算法分析 希尔排序又叫缩小增量排序,它是对直接插入排序算法的一种改进.希尔排序算法的基本思想是先将整个待排序的序列划分为若干个子序列,然后 ...

  7. 希尔排序(详解与代码)

    希尔排序算是对简单插入排序的一种改进,属于一种增量式的排序算法. 还不明白希尔排序概念的,先看这个希尔排序介绍 直接放代码 package com.lingaolu;/*** @author 林高禄* ...

  8. 深圳Java培训:5分钟了解希尔排序

    深圳Java培训:5分钟了解希尔排序 前言 希尔排序(shell sort)是插入排序的一种,它是简单插入排序经过改进之后的一个更高效的算法,这个排序方法又称为缩小增量排序. 希尔排序思想介绍 简单来 ...

  9. 排序算法研究之希尔排序(shell sort)

    前面几个小节,我们分别介绍了冒泡排序,插入排序,直接快速排序 ,选择排序本节,我们介绍插入排序的改进版的希尔排序. 希尔排序是1959年,Shell发明的,这是第一个突破O(n2)的排序算法,他与直接 ...

最新文章

  1. golang 切片copy复制 和 等号复制 区别
  2. 剑指offer07.重建二叉树
  3. Python知识:关于map
  4. 丑憨批的爬虫笔记2(爬虫引发的问题+robots协议)
  5. SQL Server 中的时间算法
  6. FileSystemObject (FSO)对象方法总结及应用
  7. 【OS学习笔记】十一 实模式:中断-软中断和硬中断基本原理
  8. c语言求a1到an的和,C语言菜鸟基础教程之a++与++a
  9. 山东工业大学计算机及应用,彭玉旭副教授
  10. 容器编排技术 -- Init 容器
  11. 欺诈场景中的随机森林实践(基于SAS场景的实现)
  12. 教你搭建一个NAT实验环境
  13. Wi-Fi连接握手包抓包
  14. 为 github markdown 文件生成目录(toc)
  15. matlab受力分析,基于Matlab的多支座蒸压釜的受力分析和强度计算
  16. 推荐一个不错的在线文档分享网站-Scribd,陆续分享我的电子藏书
  17. postgresql - SQL查询某一天内的记录
  18. flink catalog 及dialect、数据转存分析
  19. 基于深度表征学习特征的抗癌肽预测
  20. 汽车行业深度报告-特斯拉生产制造革命:一体化压铸

热门文章

  1. 关于爱和幸福-最美的十首诗歌
  2. Sql server 删除重复数据
  3. 第二十五篇 -- 学习第三十四天打卡20190726
  4. 斯坦福密码学-3-分组密码block_cipher
  5. 焦虑的考证大军经历了啥?他们现在怎么样了?
  6. 如何在 iPhone 和 iPad 上关闭照片的地理标记
  7. 整治直播经济下的治理乱象,或许该从区块链入手
  8. 职业女性确实处于劣势吗?记一次不甚严谨的考据 -- 向胡适之先生的遥远致敬
  9. php 模板解析,PHP模板解析类
  10. Spring Boot 进阶,Spring Boot面试题高频出处