插入排序实现——直接插入排序和希尔排序
目录
1.插入排序
1.1基本思想:
1.2直接插入排序
1.3希尔排序(缩小增量排序)
1.插入排序
1.1基本思想:
直接插入排序是一种简单的插入排序法,其基本思想是:
把待排序的记录按其关键码值的大小逐个插入到一个已经排好序的有序序列中,直到所有的记录插入完为 止,得到一个新的有序序列 。
1.2直接插入排序
当插入第i(i>=1)个元素时,前面的array[0],array[1],…,array[i-1]已经排好序,此时用array[i]的排序码与array[i-1],array[i-2],…的排序码顺序进行比较,找到插入位置即将array[i]插入,原来位置上的元素顺序后移
具体实现:
//插入排序
//时间复杂度:O(N^2)
//稳定性:稳定
//应用场景:适用于数据接近有序或数据量少
void InsertSort(int array[], int size)
{for(int i = 0; i < size; ++i)//依次将array中的元素进行插入{int key = array[i];//待插入元素,之前均有序int end = i - 1;//end为前边已有序序列的最后一个元素的下标while (end >= 0 && key < array[end])//当前序列中元素数大于1,且当前待插入元素小于有序序列的最后一个元素{array[end+1] = array[end ];//将大于当前待插入元素的元素向后移一位end--;//end往前,继续与前边有序元素比较}//直到待插入元素大于或等于前边有序序列的某个元素时,将待插入元素key插入到该元素后面//插入keyarray[end + 1] = key;}
}
结果展示:
直接插入排序的特性总结:
1. 元素集合越接近有序,直接插入排序算法的时间效率越高
2. 时间复杂度:O(N^2)
3. 空间复杂度:O(1),它是一种稳定的排序算法
4. 应用场景:适用于数据接近有序或数据量小
5. 稳定性:稳定
1.3希尔排序(缩小增量排序)
希尔排序(Shell's Sort)是插入排序的一种又称“缩小增量排序”(Diminishing Increment Sort),是直接插入排序算法的一种更高效的改进版本。希尔排序是非稳定排序算法。该方法因 D.L.Shell 于 1959 年提出而得名。
希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法排序;随着增量逐渐减少,每组包含的关键词越来越多,当增量减至 1 时,整个文件恰被分成一组,排序便终止
具体方法实现:
此处gap取法是按照Knuth提出的取gap=[gap/3]+1。
//希尔排序
//时间复杂度:O(N^1.25)~O(1.6N^1.25)
//稳定性:不稳定
//应用场景:数据杂乱或数据量大时
void ShellSort(int array[], int size)
{int gap = size;//int gap = 3;//元素之间的距离,当前序列中元素距离为3的分为一组while (gap >1)//gap>=1{gap = gap / 3 + 1;for (int i = gap; i < size;++i)//依次将array中的元素进行插入{int key = array[i];//待插入元素,之前均有序int end = i - gap;//end为当前分组的已有序序列的最后一个元素的下标while (end >= 0 && key < array[end])//当前序列中元素数大于1,且当前待插入元素小于有序序列的最后一个元素{array[end + gap] = array[end];//将大于当前待插入元素的元素在当前分组向后移一位end-=gap;//end往前,继续与前边有序元素比较}//直到待插入元素大于或等于前边有序序列的某个元素时,将待插入元素key插入到该元素当前分组的后一位//插入keyarray[end + gap] = key;}//gap -= 1;}
}
结果展示:
希尔排序的特性总结:
1. 希尔排序是对直接插入排序的优化。
2.稳定性:不稳定
3.时间复杂度:由于gap的取值方法不同,时间复杂度不固定,此处用Knuth的gap取法,时间复杂度为O(N^1.25)~O(1.6N^1.25)
4.空间复杂度:O(1)
5.应用场景:数据杂乱或数据量大
插入排序实现——直接插入排序和希尔排序相关推荐
- 数据结构与算法 | 直接插入排序、希尔排序
前几章讲了选择排序中的直直接选择排序.双向选择排序.堆排序,这次来讲讲利用'插入'为核心来实现的插入排序算法. 插入排序 把待排序的记录按其关键码值的大小逐个插入到一 个已经排好序的有序序列中,直到所 ...
- 排序(基本概念及分类,直接插入排序和希尔排序)
排序的概念 排序:所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作. 稳定性:假定在待排序的记录序列中,存在多个具有相同的关键字的记录,若经过排序,这些记录的相对 ...
- 九大经典算法之插入排序、希尔排序
01 插入排序(Insertion Sort) 原理:每次选择一个元素,并且将这个元素和整个数组中的所有元素进行比较,然后插入到合适的位置. void insertion_sort(int arr[] ...
- python实现希尔排序算法_排序算法总结(冒泡排序、直接插入排序、希尔排序)(python实现)...
其实本文叫排序算法总结有点过了,只是用python实现了一遍.本文都是参照一篇csdn博客<数据结构排序算法>,里面详细介绍每种排序算法的原理,并给出了C++的实现,再次膜拜. # -*- ...
- 希尔排序法(插入排序的改进版本)
(图片版权归原作者,下面给出的方案的时间复杂度比这个低) 希尔排序是在插入排序的基础上的一点改进,对于插入排序很熟悉的,希尔排序就很容易理解,如果插入排序不是很清楚的,可以看下插入排序的用法:插入排序 ...
- 【数据结构与算法】内部排序之一:插入排序和希尔排序的N中实现(不断优化,附完整源码)...
转载请注明出处:http://blog.csdn.net/ns_code/article/details/20043459 前言 本来想将所有的内部排序总结为一篇博文,但是随着研究的深入,还是放弃 ...
- 【Java】插入排序、希尔排序详解
文章目录 1️⃣必备排序常识 2️⃣插入排序 1.直接插入排序 2.优化后的插入排序 3.折半插入排序 4.性能比较 3️⃣希尔排序 性能比较 1️⃣必备排序常识 稳定性:在原序列中,r[i]=r[j ...
- JS 排序算法详解(冒泡排序,选择排序,插入排序,希尔排序,快速排序)
JS 排序算法详解(冒泡排序,选择排序,插入排序,希尔排序,快速排序) 一. 大O表示法 在进行排序算法之前,我们得先掌握一种对算法效率的表示方法,大O表示法. 我们使用大O表示法来表示算法的时间复杂 ...
- 算法结构2.希尔排序
希尔是一个人的名字,因为他在论文中首次提到了这样的排序方式,这是希尔排序的来源 希尔排序,比插入排序有更加的优化, 有很多的文章中说希尔排序中也用到了插入排序,这样的说法只是为了方便理解,其实是不正确 ...
- 《Algorithm算法》笔记:元素排序(2)——希尔排序
<Algorithm算法>笔记:元素排序(2)--希尔排序 Algorithm算法笔记元素排序2希尔排序 希尔排序思想 为什么是插入排序 h的确定方法 希尔排序的特点 代码 有关排序的介绍 ...
最新文章
- Datawhale组队学习周报(第035周)
- 深度学习综述:Hinton、Yann LeCun和Bengio经典重读
- 强大的Vivado IP工具——自定义IP的使用
- LeetCode 100相同的树101对称二叉树
- 微信小程序开发系列二:微信小程序的视图设计
- 面试了3个 85前 的嵌入式软件工程师
- Java命令行界面(第23部分):Rop
- memcache 防火墙策略
- Pycharm远程调试服务器程序
- 从最理想的情况论证自己的观点,必然错误,为什么明知故犯?
- python制作的项目进度管理_项目管理必备——使用燃尽图监控项目整体进度
- 98道常见Hadoop面试题及答案解析
- 【CPRI】(3)帧格式详解(重点)
- html插入视频快捷键代码,pr添加关键帧的快捷键是什么?
- Android中关于libs和JniLibs的各种坑
- 简单的js时间转中文大写时间
- java定义贵宾卡等级_会员卡分成那几个级别,分别有什么叫法
- c语言str相关的函数
- 无线传感器网络期末复习知识点总结资料
- 基于python的数字图像处理--学习笔记(三)