排序算法 之希尔排序及时间复杂度分析
- 排序算法之 冒泡排序及性能优化(时间复杂度+空间复杂度分析)
- 排序算法之 简单选择排序及时间复杂度分析
- 排序算法之 直接插入排序及时间复杂度分析
希尔排序
算法思想:将整个待排序列分割成若干个子序列(由相隔增量个元素组成),分别进行直接插入排序,然后依次缩小增量再进行排序,待整个序列中的元素基本有序时,再对全体元素进行一次直接插入排序。
希尔排序的实现应该由三个循环完成
(1)第一次循环,将增量d依次折半,直到增量d=1
(2)第二三层循环,也就是直接插入排序所需要的两次循环。
算法实现
#include <stdio.h>
#define N 9int main(void)
{int arr[N] = {9,1,5,8,3,7,4,6,2};int d = N / 2; //增量先取一半int i,j,insertVal;//希尔排序三层循环while(d>=1) //当增量大于等于1,不断进行插入排序{//一下两层for循环是直接插入排序代码for(i=d; i<N; i++){insertVal = arr[i];j = i - d;while(j>=0 && arr[j]>insertVal){arr[j+d] = arr[j];j = j - d;}arr[j+d] = insertVal;}d = d / 2;}for(i=0; i<N; i++){printf("%d ",arr[i]);}return 0;
}
由如上代码知,希尔排序的关键并不是随便分组后各自排序,而是将相隔某个增量的记录组成一个子序列,实现跳跃式移动,使得排序的效率高。
时间复杂度
时间复杂度为O(n^1.5),要好于直接排序的O(n ^ 2),需要注意的是增量序列的最后一个增量值必须是1.另外由于记录跳跃式的移动,希尔排序并不是一种稳定的排序方法。
排序算法 之希尔排序及时间复杂度分析相关推荐
- 排序算法:希尔排序算法实现及分析
希尔排序算法介绍 希尔排序是D.LShell 与1957年提出来的一种排序算法,在这之前排序算法的时间复杂度都是O(n^2),希尔排序算法是突破这个时间复杂度的第一批算法之一.我们知道直接插入排序算法 ...
- C/C++排序算法(2)希尔排序
常见排序算法总结(2)希尔排序 一篇文章,带你搞懂 希尔排序 (注:代码语言的选择不应该限制了我们对算法的理解) 文章附有动图!一看就懂! (1)工作原理 希尔排序,也称递减增量排序算法,是插入排序的 ...
- 经典排序算法之希尔排序
排序:希尔排序(算法) 一.简介 希尔排序(Shell Sort)是插入排序的一种算法,是对直接插入排序的一个优化,也称缩小增量排序. 希尔排序是非稳定排序算法. 希尔排序因DL.Shell于1959 ...
- JAVA排序算法之希尔排序
基本介绍 希尔排序是希尔(Donald Shell)于 1959 年提出的一种排序算法.希尔排序也是一种插入排序,它是简单插入排序经过改进之后的一个更高效的版本,也称为缩小增量排序. 希尔排序法基本思 ...
- [算法]-排序算法之希尔排序
希尔排序算法思想 希尔排序的实质就是分组插入排序,该方法又称缩小增量排序. 基本思想是:先将整个待排元素序列分割成若干个子序列(由相隔某个"增量"的元素组成的)分别进行直接插入排序 ...
- 排序算法之希尔排序(Java实现)
希尔排序介绍 希尔排序是希尔(Donald Shell)于1959年提出的一种排序算法.希尔排序也是一种插入排序,它是简单插入排序经过改进之后的一个更高效的版本,也称为缩小增量排序. 希尔排序基本思想 ...
- 排序算法(4)希尔排序
排序算法(4)希尔排序 原理: 希尔排序也称缩小增量排序:希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法排序, 随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时(用gap ...
- php取名字算法,JavaScript排序算法之希尔排序的2个实例_基础知识
插入排序在对几乎已经排好序的数据操作时, 效率高, 即可以达到线性排序的效率. 但插入排序一般来说是低效的, 因为插入排序每次只能将数据移动一位. 希尔排序按其设计者希尔(Donald Shell)的 ...
- 常见排序算法之希尔排序
文章目录 1.概述 2.希尔排序之交换法 3.希尔排序之移动法 4.测试案例 1.概述 由于简单的插入排序每次数据量变多的时候,数据需要移动且交换数据的次数也会变多,继而影响效率.希尔排序就是在这个基 ...
最新文章
- Android 自定义debug.keystore
- pandas isnull 函数
- Codeforces 989C (构造)
- EF通用数据层封装类(支持读写分离,一主多从)
- Python MySQL创建表
- 堆栈在DNA计算机中的应用,堆栈和二叉树数据结构在DNA计算机中的设计与实现
- 大数据_Flink_数据处理_资源的分配和并行度测试---Flink工作笔记0013
- GitLab5.3修改项目仓库名称后wiki不能访问
- 支付弹出php,PHP微信公众号支付弹出“NaN:undefined”解决方法
- 360浏览器html在哪儿,360浏览器的收藏夹在哪_如何找到360浏览器收藏夹路径位置...
- java从菜鸟到巨佬的学习目标
- 计算机编程的好处,青少年学习编程的好处有哪些?
- 实用必备:可以迅速让你出口成章的英语短语
- 书籍_《未来世界的幸存者》阮一峰--2/5
- 微信每日早安推送,自定义推送名称,企业号推送非订阅号测试号,python源码,无需第三方多个网站注册、无第三方接口,无基础快速上不了手
- 黑苹果卡在白苹果不动_iphone5开机白屏中间黑苹果,卡住不动。
- python批量修改文件扩展名
- Springboot实现热启动、热部署
- LINUX防火墙开放端口,查看状态,查看开放端口
- python基础学习task09
热门文章
- 3rd TMA大数据营销案例征集赛正式启动,报名ing!
- boss是董卓的java游戏_武将列传世界BOSS董卓-殒命长安攻略
- 世界著名设计公司-网址介绍
- ps抠图技巧之图层样式
- 有哪些计算机语言可以爬虫,爬虫是干嘛的?用什么语言学爬虫好?
- SEPIC 单端初级电感转换器 稳压器 -- Zeta 转换器
- C# 很少人知道的科技
- python计算运动会某个参赛选手的得分。数据保存在文件中_为什么一定要考计算机二级证书?8个好处,考和没考区别有点大...
- python中encode和decode使用讲解与演示
- websocket 给服务端发送太长数据处理(The decoded text message was too big for the output buffer and the endpoint )