【数据结构】希尔排序
常见的排序算法有以上八种,所以预估会分成几期来讲,感兴趣的朋友们不妨点个收藏专栏。 ღ( ´・ᴗ・` )比心
OJ链接
希尔排序
在 插入排序 已经提到当数组接近有序的时候,时间复杂度趋于O(N)。
所以希尔排序是基于直接插入排序的优化,通过预排序使数组趋于有序,这种情况对逆序数组更加明显。
希尔排序的分为预排序(gap > 1)和直接插入( gap == 1)排序两步骤。
预排序,使数组接近有序
按照gap分组,对每一组进行插入排序。
假设 gap = 3
对gap组预排序完毕
对逆序数组按照gap进行分组,更接近有序。
时间复杂度
最好:O(N)
最坏:F(N, gap) = (1+2+3+ …… + N/gap)* gap
所以,gap越大,预排越快,但是预排之后越不接近有序
对一组gap进行单趟排序
for (int i = 0; i < n - gap; i += gap){// 对其中一组进行单趟的插入排序int end = 0;int x = a[end + gap];while (end >= 0){// end=-1时,退出if (a[end] > x){a[end + gap] = a[end];end -= gap;}else{// a[end] <= xbreak;}}a[end + gap] = x;}
对这一gap组排序完毕
int gap = 3;for (int j = 0; j < gap; ++j){for (int i = 0; i < n - gap; i += gap){// 对其中一组进行单趟的插入排序int end = 0;int x = a[end + gap];while (end >= 0){// end=-1时,退出if (a[end] > x){a[end + gap] = a[end];end -= gap;}else{// a[end] <= xbreak;}}a[end + gap] = x;}}
优化
gap 从n 开始预排序,同时多组gap一起排序。
void ShellSort(int* a, int n)
{int gap = n;while(gap > 1){gap /= 2;for(int i = 0; i < n-gap; ++i){// 对一个gap组的一个单趟排序int end = i;int x = a[end+gap];while(end >= 0){if(a[end] > x){a[end+gap] = a[end];end -= gap;}else{break;}}a[end+gap] = x;}}
}
时间复杂度
gap是按照Knuth提出的方式取值的,而且Knuth进行了大量的试验统计。
所以时间复杂度按照 O(N^ 1.25) 到 O(1.6*N ^ 1.25)计算。
【数据结构】希尔排序相关推荐
- 数据结构:希尔排序(shell sort)
希尔排序-----交换法 import java.util.Arrays;public class ShellSort {public static void main(String[] args) ...
- [数据结构] 希尔排序
概述 希尔排序法(缩小增量法) 属于插入类排序,是将整个无序列分割成若干小的子序列分别进行插入排序的方法. 把记录按下标的一定增量分组,对每组使用直接插入排序算法排序:随着增量逐渐减少,每组包含的关键 ...
- python算法与数据结构-希尔排序算法
希尔排序(shell sort)是插入排序的一种,也称缩小增量排序,与普通的插入算法的区别就是gap步长. 希尔排序内层循环逻辑如下所示: 上面的可以分为4组,一个一个的按照插入算法来做,第一组有54 ...
- python算法与数据结构-希尔排序算法(35)
阅读目录 一.希尔排序的介绍 二.希尔排序的原理 三.希尔排序的图解 四.希尔排序的python代码实现 五.希尔排序的C语言实现 六.希尔排序的时间复杂度 七.希尔排序的稳定性 一.希尔排序的介绍 ...
- java 数据结构--希尔排序
2019独角兽企业重金招聘Python工程师标准>>> 希尔排序(Shell Sort)又称缩小增量排序算法的基本思路是:先取一个小于n的整数(称为增量)然后把排序中的n个记 ...
- 数据结构-希尔排序(Java实现)
希尔排序 对插入排序的优化 因为当如果插入排序中最小的元素位于最后一位时,就需要不断的进行循环判断,直到第一位,非常影响效率 package datastructure.sort;/*@CreateT ...
- 基本算法学习(一)之希尔排序(JS)
参考书: 严蔚敏-数据结构 希尔排序(Shell's Sort) 希尔排序又称"缩小增量排序",归属于插入排序一类,简单来说,和我们的插入排序比,它更快. 奇妙的记忆点: 内排序( ...
- 数据结构与算法之希尔排序
数据结构与算法之希尔排序 目录 希尔排序介绍 希尔排序法的示意图 代码实现 1. 希尔排序介绍 简单插入排序存在的问题:当然需要插入的数是较小的数时,后移的次数明显增加,对效率有影响. 希尔排序法介绍 ...
- 中希尔排序例题代码_【数据结构与算法】这或许是东半球分析十大排序算法最好的一篇文章...
码农有道 历史文章目录(请戳我) 关于码农有道(请戳我) 前言 本文全长 14237 字,配有 70 张图片和动画,和你一起一步步看懂排序算法的运行过程. 预计阅读时间 47 分钟,强烈建议先收藏然后 ...
- 希尔排序python 简书_数据结构_排序_直接插入+希尔排序
数据结构_排序_直接插入排序+希尔排序 其实主要是为了讲述希尔排序,不过插入排序是希尔排序的基础,因此先来讲直接插入排序. 一.直接插入排序 1.原理 下标 0 1 2 3 4 5 6 7 8 -- ...
最新文章
- 【数据分析】33个热门数据分析软件,你都用过哪些?
- linux-2.6.29内核配置、编译与安装
- P5496-[模板]回文自动机【PAM】
- c语言 字符串不足用零代替,关于c语言的知识点不足的地方
- 我的站(艾网---城市生活新门户)重新上线了
- linux下Apache默认安装路径
- 基础学习day06---面向对象二---static,类的初始化和调用顺序、单例模式
- 关于NX UG11.0在visual studio中不能创建模板的问题
- NOD32升级账号更新器 [ C# | NOD32 | Eset ]
- 中国历史上最伟大帝王排行榜
- Mac电脑鼠标滚轮方向相反的解决办法
- lineage+os+15+android,小米5 原生 Android 8.1“奥利奥”——lineageOS 15.1安装教程
- android系统wifi控制风扇,无线远程遥控风扇设计实现
- 76、多边形一些基本操作(自相交、尖刺、保证逆时针、求交)
- 布尔盲注运用burp的操作
- C++ 高效编程:pass-by-value(值传递)与pass-by-reference(引用传递)
- php yii的优缺点,YII2框架的优缺点是什么
- 面经手册 · 第2篇《数据结构,HashCode为什么使用31作为乘数?》
- 安搭Share——人不要怕“变”,要守住自己的“常”
- 电源管理-配置唤醒源