插入排序基本思想

每次将一个待排序的记录按其keyword大小插入到前面已经拍好序的子文件的适当位置,直到全部记录插入完毕为止。

直接插入排序

基本思想

直接插入排序的基本操作是将一个记录插入到已排好序的有序表中。从而得到一个新的有序表。即如果待排序的记录存放在数组R[1······n]中,排序过程中,R被分成两个子区间R[1······i]和R[i+1······n],当中。R[1······i]是已经排好序的有序区;R[i+1······n]是当前未排序的部分。

将当前无序区的第一个记录R[i+1]插入到有序区R[1······i]的适当位置,使R[1······i+1]变为新的有序区,每次插入一个数据,直到全部的数据有序为止。

java程序

/*************************
*
* 直接插入排序
*
*************************/
public class InsertSort { private void insertSort(int[] datas) {
if (datas == null || datas.length < 2)
return;
int i, j, insertData;
for (i = 1; i < datas.length; i++) {
insertData = datas[i];// 要插入的变量
for (j = i - 1; j >= 0 && insertData < datas[j]; j--)
datas[j + 1] = datas[j];
datas[j + 1] = insertData;// 将要插入的数据放置到正确的位置
}
} public static void main(String[] args) {
int[] datas = new int[] { 6, 5, 3, 1, 8, 7, 2, 4 };
System.out.println("********排序前********");
for (int i = 0; i < datas.length; i++) {
System.out.print(datas[i] + ",");
}
InsertSort insertSort = new InsertSort();
insertSort.insertSort(datas);
System.out.println("\n********排序后********");
for (int i = 0; i < datas.length; i++) {
System.out.print(datas[i] + ",");
}
} }

性能分析

  1. 时间复杂度

  1. 直接插入排序属于就地排序,是一种稳定的排序方法。

希尔排序

基本思想

先取一个小于n的整数d1作为第一个增量,把文件的全部记录分成d1个组,全部距离为d1的倍数的记录放在同一个组中,在各组内进行插入排序;然后。取第二个增量d2 < d1,反复上述的分组和排序,直至所取得增量dt = 1(dt < dt-1 < ······ < d2 < d1),即全部记录放在同一个组中进行直接插入排序为止。

java程序

/*************************
*
* 希尔排序
*
*************************/
public class ShellSort { private void shellSort(int[] datas) {
if (datas == null || datas.length < 2)
return;
int temp;// 暂存变量
int dataLength;// 步长
int pointer;// 进行处理的位置
dataLength = datas.length / 2;// 初始化步长
while (dataLength != 0) {
for (int j = dataLength; j < datas.length; j++) {
temp = datas[j];
pointer = j - dataLength;
while (pointer >= 0 && temp < datas[pointer]) {
datas[pointer + dataLength] = datas[pointer];
pointer = pointer - dataLength;
}
datas[pointer + dataLength] = temp;
}
dataLength = dataLength / 2;
}
} public static void main(String[] args) {
int[] datas = new int[] { 6, 5, 3, 1, 8, 7, 2, 4 };
System.out.println("********排序前********");
for (int i = 0; i < datas.length; i++) {
System.out.print(datas[i] + ",");
}
ShellSort shellSort = new ShellSort();
shellSort.shellSort(datas);
System.out.println("\n********排序后********");
for (int i = 0; i < datas.length; i++) {
System.out.print(datas[i] + ",");
}
} }

性能分析

希尔排序的运行时间依赖于增量序列(步长)的选取。好的增量序列有例如以下特点:

  1. 最后一个增量必须为1
  2. 应该尽量避免序列中的值(尤其是相邻的值)互为倍数的情况。

希尔排序的时间性能要因为直接插入排序,原因例如以下:

  • 当文件初态基本有序时直接插入排序所需的比較和移动次数均较少。
  • 在希尔排序開始时增量较大,分组较多,每组的记录数目少,故各组内直接插入较快,后来增量di逐渐缩小,分组数逐渐降低。而各组的记录数目逐渐增多,但因为已经按di-1作为距离排过序,使文件较接近于有序状态。所以新的一趟排序过程也较快。

    因此,希尔排序在效率上较直接插入排序有较大的改进。

希尔排序是一种不稳定的排序方法

參考资料:《数据结构与算法分析——java语言描写叙述》、《大话数据结构》

【算法拾遗(java描写叙述)】--- 插入排序(直接插入排序、希尔排序)的更多相关文章

  1. 【算法拾遗(java描写叙述)】--- 选择排序(直接选择排序、堆排序)

    选择排序的基本思想 每一趟从待排序的记录中选出关键字最小的记录,顺序放在已排好序的子文件的最后,知道所有记录排序完毕.主要有两种选择排序方法:直接选择排序(或称简单选择排序)和堆排序. 直接选择排序 ...

  2. 必须知道的八大种排序算法【java实现】(二) 选择排序,插入排序,希尔算法【详解】

    一.选择排序 1.基本思想:在要排序的一组数中,选出最小的一个数与第一个位置的数交换:然后在剩下的数当中再找最小的与第二个位置的数交换,如此循环到倒数第二个数和最后一个数比较为止. 2.实例 3.算法 ...

  3. 牛客网Java刷题知识点之插入排序(直接插入排序和希尔排序)、选择排序(直接选择排序和堆排序)、冒泡排序、快速排序、归并排序和基数排序(博主推荐)

    不多说,直接上干货! 插入排序包括直接插入排序.希尔排序. 1.直接插入排序: 如何写成代码: 首先设定插入次数,即循环次数,for(int i=1;i<length;i++),1个数的那次不用 ...

  4. 【特征检測】BRIEF特征点描写叙述算法

    简单介绍 BRIEF是2010年的一篇名为<BRIEF:Binary Robust Independent Elementary Features>的文章中提出,BRIEF是对已检測到的特 ...

  5. 常见排序算法总结与分析之交换排序与插入排序-C#实现

    前言 每每遇到关于排序算法的问题总是不能很好的解决,对一些概念,思想以及具体实现的认识也是模棱两可.归根结底,还是掌握不够熟练.以前只是看别人写,看了就忘.现在打算自己写,写些自己的东西,做个总结.本 ...

  6. 用 Java 实现常见的 8 种内部排序算法

    一.插入类排序 插入类排序就是在一个有序的序列中,插入一个新的关键字.从而达到新的有序序列.插入排序一般有直接插入排序.折半插入排序和希尔排序. 1. 插入排序 1.1 直接插入排序 /** * 直接 ...

  7. 浅谈C++之冒泡排序、希尔排序、快速排序、插入排序、堆排序、基数排序性能对比分析之后续补充说明(有图有真相)

    如果你觉得我的有些话有点唐突,你不理解可以想看看前一篇<C++之冒泡排序.希尔排序.快速排序.插入排序.堆排序.基数排序性能对比分析>. 这几天闲着没事就写了一篇<C++之冒泡排序. ...

  8. 【OpenCV新手教程之十八】OpenCV仿射变换 &amp; SURF特征点描写叙述合辑

    本系列文章由@浅墨_毛星云 出品,转载请注明出处. 文章链接:http://blog.csdn.net/poem_qianmo/article/details/33320997 作者:毛星云(浅墨)  ...

  9. Java实现希尔排序

            华杰让我看了一道面试题:现有一段程序S,可以对任意n个数进行排序.如果现在需要对n^2个数进行排序,最少需要调用S多少次?(只允许调用S,不可以做别的操作).         看到了这 ...

随机推荐

  1. 【kruscal】【最小生成树】【并查集扩展】bzoj3714 [PA2014]Kuglarz

    ORZ:http://www.cnblogs.com/zrts/p/bzoj3714.html #include<cstdio> #include<algorithm> usi ...

  2. 倒置输入的数 Exercise07_02

    import java.util.Scanner; /** * @author 冰樱梦 * 时间:2018年下半年 * 题目:倒置输入的数 * */ public class Exercise07_0 ...

  3. 求小于10000的素数的个数 Exercise06_10

    /** * @author 冰樱梦 * 时间:2018年下半年 * 题目:求小于10000的素数的个数 * */ public class Exercise06_10 { public static ...

  4. 程序调控和监视(Logcat,Debug)

    1.Logcat 2.效果图:实现点击Button,提示Logcat信息 (1)activity_main.xml <?xml version="1.0" encoding= ...

  5. UITextField增加textDidChange回调功能

    在使用UITextField来判断登陆按钮状态时只有 shouldChangeCharactersInRange函数,是在文件还没有改变前就调用了,而不是在改变后调用,要想实现改变后调用的功能,导致登 ...

  6. Jigsaw 项目:Java 模块系统新手引导

    前言 随着 2017 年 10 月 Java 9 的发布,Java 能够使用模块系统了,但是中文互联网上的资料太少,许多关于 Java 模块系统的文章都只是介绍了模块系统的好处,或者给了一些毫无组织的 ...

  7. 刷新神经网络新深度:ImageNet计算机视觉挑战赛微软中国研究员夺冠

    微软亚洲研究院首席研究员孙剑 世界上最好计算机视觉系统有多精确?就在美国东部时间12月10日上午9时,ImageNet计算机视觉识别挑战赛结果揭晓——微软亚洲研究院视觉计算组的研究员们凭借深层神经网络 ...

  8. js判断上传文件的大小、类型、修改日期等信息

    1.找到上传文件的前端代码,下断点,进行调试,使用jquery获得上传文件对象 2.鼠标放到文件对象fielEl上,弹出文件对象具体内容,可以看大文件对象的:上次修改时间.名字.大小.类型等信息 3. ...

  9. 电脑(台式机||笔记本)开机password忘记通用解决方法

    方法:直接制作一个老毛桃装机版u盘启动盘 网址:老毛桃官网 步骤:依照网址的解说,将制作好的U盘插入到电脑的usb插口.执行Windows 登入password破解菜单,搜索password所在的盘符 ...

  10. Yii2.0源码分析之——控制器文件分析(Controller.php)创建动作、执行动作

    在Yii中,当请求一个Url的时候,首先在application中获取request信息,然后由request通过urlManager解析出route,再在Module中根据route来创建contr ...