【算法拾遗(java描述)】--- 插入排序(直接插入排序、希尔排序)
来源:互联网 发布:映射网络驱动器 编辑:程序博客网 时间:2024/05/29 03:04
插入排序基本思想
每次将一个待排序的记录按其关键字大小插入到前面已经拍好序的子文件的适当位置,直到全部记录插入完成为止。
直接插入排序
基本思想
直接插入排序的基本操作是将一个记录插入到已排好序的有序表中,从而得到一个新的有序表。即假设待排序的记录存放在数组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] + ","); }}}
性能分析
- 时间复杂度
- 直接插入排序属于就地排序,是一种稳定的排序方法。
希尔排序
基本思想
先取一个小于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
- 应该尽量避免序列中的值(尤其是相邻的值)互为倍数的情况。
希尔排序的时间性能要由于直接插入排序,原因如下:
- 当文件初态基本有序时直接插入排序所需的比较和移动次数均较少。
- 在希尔排序开始时增量较大,分组较多,每组的记录数目少,故各组内直接插入较快,后来增量di逐渐缩小,分组数逐渐减少,而各组的记录数目逐渐增多,但由于已经按di-1作为距离排过序,使文件较接近于有序状态,所以新的一趟排序过程也较快。因此,希尔排序在效率上较直接插入排序有较大的改进。
希尔排序是一种不稳定的排序方法
参考资料:《数据结构与算法分析——java语言描述》、《大话数据结构》
2 1
- 【算法拾遗(java描述)】--- 插入排序(直接插入排序、希尔排序)
- java实现排序算法之插入排序(直接插入排序,折半插入排序,希尔排序)
- 算法-排序-插入排序(直接插入和希尔排序)
- Java---插入类排序(直接插入排序,希尔排序)
- 排序算法--插入排序(直接插入排序、希尔排序)Java实现
- 【Java常用排序算法】插入排序(直接插入排序、希尔排序)
- 排序算法——插入排序(直接插入排序、折半插入排序、希尔排序)
- Java排序算法总结之(一)——插入排序(直接插入排序、折半插入排序、希尔排序)
- 排序算法(一)------直接插入排序和希尔排序
- 插入排序(希尔排序、直接插入、折半插入排序)
- 【排序】插入排序(直接插入排序、希尔排序)
- 【排序一】插入排序(直接插入排序&&希尔排序)
- 排序算法(堆排序,直接插入排序,折半插入排序,希尔排序)
- java数据结构之插入排序(直接插入排序、折半插入排序、希尔排序)
- 排序算法java 一 --快速排序、直接插入、希尔排序
- 插入排序(直接插入排序、希尔排序)
- 插入排序(直接插入排序和希尔(shell)排序
- 插入排序(直接插入排序与希尔排序)
- HTml--7(css的常用属性)
- Mac pro中的快捷键+Xcode中的快捷键
- 体验vSphere 6之1-安装VMware ESXi 6 RC版
- .net发邮件类
- 黑马程序员--多线程基础知识
- 【算法拾遗(java描述)】--- 插入排序(直接插入排序、希尔排序)
- http post 请求(下)
- Tips:使用Xcode查找项目中的中文字符串
- 图 之 MST(最小生成树 — kruskal算法 )并查集实现
- Codeforces Round #336 (Div. 2) B. Hamming Distance Sum
- phonegap安装 环境搭建与配置详解( 完整版 提供下载地址)
- Android 获取USB设备的类型
- Android MVP模式的应用
- http post请求(上)