程序员必会的经典排序算法(三)插入排序
来源:互联网 发布:数据库性能测试 编辑:程序博客网 时间:2024/06/01 08:56
插入排序
插入排序,也是一种基于位置比较交换的排序算法。在排序过程中,它总是维持着一个有序的子列表。例如,一个数组的较低索引部分维持着有序。排序的时候,新元素在之前有序的部分中找好位置”插入”进去。故名,插入排序。
数组被频繁的检索、为排序的项将会移动并插入到已排好序的子列表中,这些都是在一个数组中完成的。插入排序不适合数据量很大的数组排序,它的平均、最坏复杂度为O(N^2),N是数组的元素个数。
插入排序工作流程
(本文章分享在CSDN平台,更多精彩请阅读 东陆之滇的csdn博客:http://blog.csdn.net/zixiao217)
我们以一个未排序的数组为例:
插入排序首先会比较开始的两个元素:
发现14和33已经是自然序的(上升排序)了。这时候14就是排好序的子列表:
插入排序向前移动到第二个元素,比较33和27:
发现33、2,7不是自然序的:
交换33和27,同时会检查已经排好序的子列表中的所有元素,发现排好序的自列表中只有一个元素14,27大于14,交换后已经排序的子列表仍然保持是有序的:
现在,有序列表为14,27,。接下来比较33、10:
它们并不是有序的:
因此,交换33和10:
然而,交换之后,27、10是无序的了:
因此,交换27和10:
再次发现14、10不是有序的:
继续交换它们。这样3趟之后,我们得到的有序子列表如下10,14,27:
按这样的处理过程继续下去,直到所有的未排序的值均包含在一个有序的子表中。插入排序就完成了。
插入排序算法思路
按照上面的过程理一下编程思路:
- Step 1 −如果是第一个元素,则认为它是有序的。
- Step 2 − 获取下一个元素
- Step 3 − 和已经排序列表中的所有元素比较
- Step 4 − 移动有序列表中比当前待排序元素的值要大的所有元素
- Step 5 − 插入当前待排序元素
- Step 6 − 依次重复执行知道整个列表都是有序的
插入排序Java代码完整实现
最后编写Java代码实现插入排序:
package org.byron4j.sort;/** * * @author Byron.Y.Y * @version 1.0 * Java-插入排序-以整形数组为例 */public class InsertionSort { public static void sort(int[] arr){ //数组长度 int size = arr.length; //待插入位置 int holePosition = 0; //当前待插入的元素 int valueToInsert = 0; /*外层循环控制选择排序的趟数*/ for( int i = 1; i < size; i++ ){ //当前待插入的元素 valueToInsert = arr[i]; holePosition = i; //当前待排序元素与前面已排好序的列表每个元素比较并移位 while( holePosition > 0 && (arr[holePosition - 1] > arr[holePosition]) ){ //将待插元素前面比它大的元素移往后移动一位(即放到当前待插元素最开始的位置上) arr[holePosition] = arr[holePosition - 1]; //此时待插元素已经往前挪了一位了 holePosition = holePosition - 1; //待插元素往前挪了一位 arr[holePosition] = valueToInsert; } //至此第i+1趟,排序完毕,将第i+1小的元素放在第i+1的位置上 //这里可以打印出来每一趟插入排序后数组的位置元素 System.out.print("第" + ( i ) + "趟: "); for(int k = 0; k < size; k++){ System.out.print(arr[k] + ((k != size -1) ? ", " : "")); } System.out.println(); } } public static void main(String[] args) { int[] arr = {14, 33, 27, 10, 35, 19, 42, 44}; sort(arr); }}
运行结果:
第1趟: 14, 33, 27, 10, 35, 19, 42, 44第2趟: 14, 27, 33, 10, 35, 19, 42, 44第3趟: 10, 14, 27, 33, 35, 19, 42, 44第4趟: 10, 14, 27, 33, 35, 19, 42, 44第5趟: 10, 14, 19, 27, 33, 35, 42, 44第6趟: 10, 14, 19, 27, 33, 35, 42, 44第7趟: 10, 14, 19, 27, 33, 35, 42, 44
0 0
- 程序员必会的经典排序算法(三)插入排序
- 程序员必会的经典排序算法(一)冒泡排序
- 经典算法(三):插入排序
- 【程序员必知】经典排序算法
- 经典排序算法2(插入排序)
- 经典算法之直接插入排序(三种实现)
- 程序员必知的8大排序(一)-------直接插入排序,希尔排序(java实现)
- 程序员必知的8大排序(一)-------直接插入排序,希尔排序(java实现)
- 程序员必知的8大排序(一)-------直接插入排序,希尔排序(java实现)
- 程序员必知的8大排序(一)-------插入排序,希尔排序(java实现)
- 程序员必知的8大排序(一)-------直接插入排序,希尔排序(java实现)
- 程序员必知的8大排序(一)-------直接插入排序,希尔排序(java实现)
- 程序员必知的8大排序(一)-------直接插入排序,希尔排序(java实现)
- 程序员必知的8大排序(一)-------直接插入排序,希尔排序(java实现)
- 程序员必知的8大排序(一)-------直接插入排序,希尔排序(java实现)
- 必会排序算法总结
- 经典排序算法--插入排序
- 经典排序算法--插入排序
- CentOS显示没有网卡(eth0)
- WmS详解(一)之token到底是什么?基于Android7.0源码
- C#使用Protocol Buffer(ProtoBuf)进行Unity中的Socket通信
- JavaScript
- Day2JavaScript
- 程序员必会的经典排序算法(三)插入排序
- 文章标题
- in操作符检查属性
- HDU 2090
- Android SQLite是线程安全的吗?
- [C]m*n矩阵划分成k*j等份
- Intent(二)隐式调用intent
- 08 JavaScript基础之--冒泡排序
- Java学习笔记--类与对象