0. 前言java
本系列文章将介绍一些经常使用的排序算法。排序是一个很是常见的应用场景,也是开发岗位面试必问的一道面试题,有人说,若是一个企业招聘开发人员的题目中没有排序算法题,那说明这个企业不是一个“正规”的企业,哈哈,虽然有点戏谑,可是也从侧面证实了排序算法的重要性。面试
本文将介绍的是常见排序算法中的插入排序。算法
4 插入排序数组
4.1 基本思想性能
插入排序分为两种,一种是直接插入排序,一种是二分插入排序。优化
首先直接插入排序的基本思想是将序列分为排序好的部分和待排序部分,将待排序部分中的数据一个个的和前面已经排序好的部分比较(逐个从后到前顺序比较)并插入到该部分的合适位置,从而实现有序。而二分插入排序则是对直接插入排序法比较过程的一个优化,即从顺序比较变成了二分查找比较。this
4.2 直接插入排序的代码实现spa
/* *@content 直接插入排序 *@author Calvin *@blog http://blog.csdn.net/seu_calvin/article/details/55653764 *@date 2017/02/18 */ public class Order { private int[] array; public Order(int[] array){ this.array = array; } public void sort() { if(array!=null && array.length>0){ for(int i = 1; i<array.length; i++){ //本轮比较的主角 int temp = array[i]; //和前面的有序部分逐个比较 for(int j = i; j>0 ; j--){ if(temp < array[j-1]){ array[j] = array[j-1]; array[j-1] = temp; } } } } } public void print() { for(int i = 0; i < array.length; i++) System.out.println(array[i]); } public static void main(String[] args) { int[] array = new int[]{3,1,5,9,6,5,0}; Order order = new Order(array); order.sort(); order.print(); } }输出结果略去。
4.3 二分插入排序的代码实现.net
/* *@content 二分插入排序 *@author Calvin *@blog http://blog.csdn.net/seu_calvin/article/details/55653764 *@data 2017/02/18 */ public class Order { private int[] array; public Order(int[] array){ this.array = array; } public void sort() { if(array!=null && array.length>0){ for(int i = 1; i<array.length; i++){ //本轮比较的主角 int temp = array[i]; //二分查找到要插入的位置 int position = binarySearch(i-1, temp); //移动有序数列 if(i != position){ //排除不须要移动的状况 for(int j = i; j > position ; j--){ array[j] = array[j-1]; } //最后在要插入的位置插入temp array[position] = temp; } } } } //参数1为要比较的最大边界 private int binarySearch(int maxIndex, int data) { int start = 0; int end = maxIndex; int mid; while(start <= end){ mid = (start+end)/2; if(array[mid] > data){ end = mid - 1; }else{ start = mid + 1; } } return start; } public void print() { for(int i = 0; i < array.length; i++) System.out.println(array[i]); } public static void main(String[] args) { int[] array = new int[]{3,1,5,9,6,5,0}; Order order = new Order(array); order.sort(); order.print(); } }输出结果略去。
4.4 性能特色code
直接插入排序的时间复杂度为O(n*n),空间复杂度为O(1),该排序算法是稳定的,这无需所言。须要注意的是,若是数组自己有序度越高,那么插入排序的内层循环只须要比较、移动较少次,所以插入排序更适合数列近似有序的状况,可是因为其时间复杂度不太好,所以不多被单独使用。
而二分插入排序相对直接插入排序而言,减小了多余的比较。可是其时空复杂度稳定性和直接插入排序是同样的。
插入排序常常和快速排序结合使用,由于(1)快速排序在数据量较小时性能不必定好,(2)加上快排后期某个小区块内的数据相对有序,因此在快速排序的分区规模达到必定数值好比10时,改用插入排序对该“小区”内的数据进行排序。