插入排序(直接插入 、希尔)
直接插入排序
排序策略
在有序表的恰当处插入一个新元素,并保持该有序表的有序性
即,当插入第n个元素时,前n-1个元素已经是有序排列
排序过程
以集合{49, 38, 65, 97, 76, 13, 27, 49}中数据为例
①初始存储
②第一趟(插入38)
③第二趟(插入65)
③第三趟(插入97)
④第四趟(插入76)
⑤第五趟(插入13)
⑥第六趟(插入27)
⑦第七趟(插入49)
一共有八个数据,执行了七次插入操作,即对于长度为n的列,需执行n-1趟
插入数据的过程:
从已排好序的数据尾进行判断,若要插入的数据小于当前数据,则该数据后移,指针前移,判断前一位,若要插入的数据大于当前数据,则保存数据,完成插入
实现代码
/*** 插入排序* @param list 需要排序的行列* @return 排序结果*/public static int[] inSort(int[] list) {//需执行n-1次for(int i = 1; i < list.length; i++) {int add = list[i];int index = i-1;//和已经排序完成的片段进行判断新插入的数据位置//此处可用监视哨代替越界判断for(; index >=0; index--) {if(list[index] < add) {break;}else {//移动数据list[index+1] = list[index];} }//插入数据list[++index] = add; }return list;}
测试结果
时间及空间复杂度
①时间(使用移动次数和比较次数作为衡量标准)
最好,原先序列为正序:比较次数、移动次数 0
最坏,原先序列为倒序:比较次数即(n*(n+1))/2 - 1、移动次数即((n+1)*(n+2))/2 - 3(每次都得添加到序列头部)
即平均时间复杂度为:T(n)=O(n2)
②空间
在移动时不需要另外访问存储空间,所以空间复杂度:
S(n)=O(1)
③稳定性
在线性表中逐一比较,所以该算法是稳定的
适用范围
①n较小
②局部有序
Shell排序
希尔排序(Shell’s Sort)又叫“缩小增量排序”,是对直接插入排序所作的改进
排序策略
先将整个待排序的记录序列分割成为若干个子序列分别进行直接插入排序,待整个序列中的记录基本有序时,再对全体记录进行一次直接插入排序
即,对表中数据进行分组,对每个组进行排序,分组方式:n/(2^i)
排序过程
以集合{59,20,17,13,28,14,23,83,36,98,11,70,65,41,42,15}中的数据为例
①第一趟,d=16/2=8
②第二趟,d=8/2=4
③第三趟,d=4/2=2
④第四趟,d=2/2=1
⑤结果
实现代码
/*** 希尔排序* @param list 需要排序的数据* @return 排序的结果*/public static int[] sheSort(int[] list) {//设置步长,进行分组int step = list.length/2;while(step >= 1) {//i每走一步会变换一个组for(int i = step; i<list.length; i++) {//记录当前数据int add = list[i];//定位该组中前一个数据索引int j = i-step;//对每个组内的数据进行插入排序//后移数据,查询插入位置while(j >= 0 && list[j] > add) {list[j+step] = list[j];j = j - step;}list[j+step] = add;}//缩小步长,继续分组step = step/2; } return list;}
测试结果
时间及空间复杂度
因为增量d的存在,使记录不像在直接插入排序中一步步地向前移,而是跳跃式地向前移动,使整个排序的效率得到了改善
①时间(跟步进策略有关)
最好:原先序列为正序,步长d=1,即:T(n) = O(n)
最坏:若步进策略为/2
时,若序列为{1、k、2、k+1、…、k、2k}(k=n/2,n为2的整数幂)时,只有当步长d=1时,才会排序,这时退化为直接插入排序,交换次数为:1+2+…+k-1 = (k*(k-1))/2 = (n*(n-2))/8
即:T(n) = O(n2)
即平均时间复杂度为:T(n) = O(n*log2n)
②空间
S(n) = O(1)
③稳定性
不稳定
由于Shell排序是分组进行排序,它是跳跃式的向前移动,会导致原来在后面的关键字移到前面,使两个相等的关键字进行排序后的顺序会被改变
插入排序(直接插入 、希尔)相关推荐
- 十大排序算法:冒泡排序、选择排序、插入排序、希尔排序、归并排序、快速排序、堆排序、计数排序、桶排序、基数排序
冒泡排序.选择排序.插入排序.希尔排序.归并排序.快速排序.堆排序.计数排序.桶排序.基数排序的动图与源代码. 目录 关于时间复杂度 冒泡排序 选择排序 插入排序 希尔排序 归并排序 快速排序 堆排序 ...
- java版排序算法简介及冒泡排序以及优化,选择排序,直接插入排序,希尔排序,堆排序,快速排序及其优化前言 2 分类 2 稳定性 3 时间复杂度 4 Java实现版本 5 1、冒泡排序 6 2、选择排序
好吧 ~~csdn太难用了....尼玛...写了半天的也无法弄进去...lz正在找更好地博客,or放在github上打算.. 下边是lz自己的有道云分享,大概内容是 http://note.youda ...
- 图文并茂 —— 插入排序,希尔排序
图文并茂 -- 插入排序,希尔排序 每博一文案 杨绛先生曾说:世态人情,可做书读,可当细看.行走在人生的旅途中, 遇见的人数不胜数,结识的朋友也越来越多,走过半身,尝遍人情冷暖, 后领悟到一句话的真谛 ...
- 插入排序,希尔排序,堆排序
本文将介绍三种排序算法--插入排序,希尔排序,堆排序.本文所有例子都是使用升序 一.插入排序 算法思想 维护一个有序数组,将要插入的数据与有序数组自最后一个元素直到合适位置的数一一比较. eg: 有序 ...
- 直接插入排序、希尔排序
直接插入排序.希尔排序 一.直接插入排序 (1)主要思想 (2)代码实现 (3)性能分析 二.希尔排序 (1)主要思想 (2)代码实现 (3)性能分析 一.直接插入排序 直接插入排序类似于我们平时玩扑 ...
- 排序---初级排序算法(选择排序、插入排序和希尔排序)
写在前面的话: 一枚自学Java和算法的工科妹子. 算法学习书目:算法(第四版) Robert Sedgewick 算法视频教程:Coursera Algorithms Part1&2 本文 ...
- 【排序】插入类排序—(折半)插入排序、希尔排序
前言 在数据结构和算法中,排序是非常重要的一环,并且排序也是渗透编程的方方面面. 你或许在写一个sql的order by按照某组进行排序,又或者你在刷一道题时候.常常遇到贪心+自定义排序求解的思路题, ...
- 牛客网Java刷题知识点之插入排序(直接插入排序和希尔排序)、选择排序(直接选择排序和堆排序)、冒泡排序、快速排序、归并排序和基数排序(博主推荐)...
不多说,直接上干货! 插入排序包括直接插入排序.希尔排序. 1.直接插入排序: 如何写成代码: 首先设定插入次数,即循环次数,for(int i=1;i<length;i++),1个数的那次不用 ...
- ds排序--希尔排序_图解直接插入排序和希尔排序
前言 这次我们介绍插入类排序中的 直接插入排序 和 希尔排序 . 对于直接插入排序,虽然它的时间复杂度也是 O(n^2) ,但是在元素 有序或近乎有序 的情况下,时间复杂度可以降为 O(n) ,效率比 ...
- 【Java数据结构与算法】第七章 冒泡排序、选择排序、插入排序和希尔排序
第七章 冒泡排序.选择排序.插入排序和希尔排序 文章目录 第七章 冒泡排序.选择排序.插入排序和希尔排序 一.冒泡排序 1.基本介绍 2.代码实现 二.选择排序 1.基本介绍 2.代码实现 三.插入排 ...
最新文章
- matlab GUI figure置右上角
- Linux虚拟机 百度云 监控,使用Shell脚本监控KVM虚拟机
- 全网最全数据分析师干货-python篇
- linux查看密码配置文件,如何在Linux上查看和配置密码时效
- html无限添加元素,jquery--html【添加元素】
- java 简化判断_简化Java内存分析
- linux命令passwd各个参数含义
- java switch finally_JavaSE
- .net 宏定义_C语言基础知识:几种特殊的函数宏封装方式
- VB 进制转换大全(十进制、十六进制、八进制、二进制、二进制流)互转
- 英语单词-每天10个
- java技术栈是什么_java技术栈必学有哪些?
- SQL中over用法大全
- 「CF230A」龙的战争(详细分析)
- 产品经理在路上之二——用户/行业调研
- AUTOCAD——对齐标注命令
- 自定义边框的制作与换色(canvas与css3)
- OpenPCDet 训练KITTI
- 带滚动字幕的视频批量制作的方法
- 南邮matlab实验报告,南邮matlab实验报告.doc
热门文章
- ZooKeeper JMX
- python configparser模块来 读取 、 创建 和 修改 配置文件
- 我如何构建SiriWaveJS库:看一下数学和代码
- 比dropout更好的方法_比较自己的更好方法
- python是值传递还是引用传递_Python里参数是值传递还是引用传递?
- Python帮你把B站上喜欢的视频下载下来
- multiprocess模块使用进程池调用apply_async()提交的函数及回调函数不执行问题
- 用Python标准库turtle画一只老虎,祝您新年虎虎生威,大吉大利
- 将一个项目打成一个jar包,导入到另一个项目中并调用
- ASP.NET企业开发框架IsLine FrameWork系列之四--DataProvider 数据访问(上)