0. 前言

本系列文章将介绍一些常用的排序算法。排序是一个非常常见的应用场景,也是开发岗位面试必问的一道面试题,有人说,如果一个企业招聘开发人员的题目中没有排序算法题,那说明这个企业不是一个“正规”的企业,哈哈,虽然有点戏谑,但是也从侧面证明了排序算法的重要性。

本文将介绍的是常见排序算法中的插入排序。

4  插入排序

4.1  基本思想

插入排序分为两种,一种是直接插入排序,一种是二分插入排序。

首先直接插入排序的基本思想是将序列分为排序好的部分和待排序部分,将待排序部分中的数据一个个的和前面已经排序好的部分比较(逐个从后到前顺序比较)并插入到该部分的合适位置,从而实现有序。而二分插入排序则是对直接插入排序法比较过程的一个优化,即从顺序比较变成了二分查找比较。

4.2  直接插入排序的代码实现

/*
*@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  二分插入排序的代码实现

/*
*@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  性能特点

直接插入排序的时间复杂度为O(n*n),空间复杂度为O(1),该排序算法是稳定的,这无需所言。需要注意的是,如果数组本身有序度越高,那么插入排序的内层循环只需要比较、移动较少次,因此插入排序更适合数列近似有序的情况,但是由于其时间复杂度不太好,因此很少被单独使用。

而二分插入排序相对直接插入排序而言,减少了多余的比较。但是其时空复杂度稳定性和直接插入排序是一样的。

插入排序经常和快速排序结合使用,因为(1)快速排序在数据量较小时性能不一定好,(2)加上快排后期某个小区块内的数据相对有序,所以在快速排序的分区规模达到一定数值比如10时,改用插入排序对该“小区”内的数据进行排序。

算法相关——Java排序算法之插入排序(四)的更多相关文章

  1. 算法相关——Java排序算法之希尔排序(五)

    个子块,即{3,5},{1,0},{5,2},{9,4},{6,12},将每个子块进行插入排序(即第i位与第i+5位进行比较交换),初步排序结果为{3,0,2,4,6,5,1,5,9,12}.希尔排序 ...

  2. 算法相关——Java排序算法之快速排序(三)

    0. 前言 本系列文章将介绍一些常用的排序算法.排序是一个非常常见的应用场景,也是开发岗位面试必问的一道面试题,有人说,如果一个企业招聘开发人员的题目中没有排序算法题,那说明这个企业不是一个" ...

  3. 算法相关——Java排序算法之冒泡排序(二)

    0. 前言 本系列文章将介绍一些常用的排序算法.排序是一个非常常见的应用场景,也是开发岗位面试必问的一道面试题,有人说,如果一个企业招聘开发人员的题目中没有排序算法题,那说明这个企业不是一个" ...

  4. 算法相关——Java排序算法之桶排序(一)

    (代码中对应一个数组的下标),将每个元素放入对应桶中,再将所有元素按顺序输出(代码中则按顺序将数组i下标输出arrary[i]次),即为{0,1,3,5,5,6,9}. 1.2  代码实现 /* *@ ...

  5. Java排序算法(四)希尔排序2

    Java排序算法(四)希尔排序2 希尔排序移步法:分组+直接插入排序组合 一.测试类SortTest import java.util.Arrays; public class SortTest { ...

  6. java排序算法(七):折半插入排序

    java排序算法(七):折半插入排序 折半插入排序法又称为二分插入排序法,是直接插入排序法的改良版本,也需要执行i-1趟插入.不同之处在于第i趟插入.先找出第i+1个元素应该插入的位置.假设前i个数据 ...

  7. java排序算法(六):直接插入排序

    java排序算法(六):直接插入排序 直接插入排序的基本操作就是将待的数据元素按其关键字的大小插入到前面的有序序列中 直接插入排序时间效率并不高,如果在最坏的情况下,所有元素的比较次数的总和为(0+1 ...

  8. java排序算法(四):冒泡排序

    java排序算法(四):冒泡排序 冒泡排序是计算机的一种排序方法,它的时间复杂度是o(n^2),虽然不及堆排序.快速排序o(nlogn,底数为2).但是有两个优点 1.编程复杂度很低.很容易写出代码 ...

  9. java排序算法(一):概述

    java排序算法(一)概述 排序是程序开发中一种非常常见的操作,对一组任意的数据元素(活记录)经过排序操作后,就可以把它们变成一组按关键字排序的一组有序序列 对一个排序的算法来说,一般从下面三个方面来 ...

随机推荐

  1. Javascript 对象 - 字符串对象

    字符串对象 字符串对象是JavaScript中比较常见的一种基本数据类型,他封装了一个字符串,并且提供了相应的方法.例如连接字符串.取字符串.分割字符串等.JavaScript中字符串是不可变的,原始 ...

  2. (网页)HTML5

    1.html5基本格式: <!DOCTYPE> --> 文档类型声明. <html lang="zh-cn"> --> 表示html文档开始 & ...

  3. ERP承接新后台优惠规则问题

    一.后台在哪配置优惠规则? 1.设置优惠时间段: 2.添加优惠活动: 关于自动和手动: 自动:创建后,ERP同步数据后即生效.     点餐,活动会自动生效,自动计算金额. 手动:创建后,ERP需要手 ...

  4. Python基于皮尔逊系数实现股票预测

    # -*- coding: utf-8 -*- """ Created on Mon Dec 2 14:49:59 2018 @author: zhen "&q ...

  5. [20181109]12cR2 的pre_page_sga参数

    [20181109]12cR2 的pre_page_sga参数.txt --//12CR2改变了参数pre_page_sga设置为True.设置为true有好处也有缺点.--//先看看官方的定义:ht ...

  6. sql视图显示数据不对应

    出现这样的原因是修改了表的结构,没有重新编译视图,这种情况出现的几率很少,并不是没有. 解决方法:重新编译一下该视图. 视图是一个虚表,是从一个或几个基本表(或视图)中导出的表,在系统的数据字典中仅存 ...

  7. Python语法的转义字符

    Python语法的转义字符 转义字符 说 明 \ 续行符 \n 换行符 \0 空  \t 水平制表符,用于横向跳到下一制表位 \'' 双引号 \' 单引号 \\ 一个反斜杠 \f 换页 \0dd 八进 ...

  8. 简单易懂的程序语言入门小册子(4):基于文本替换的解释器,递归,如何构造递归函数,Y组合子

    递归.哦,递归. 递归在计算机科学中的重要性不言而喻. 递归就像女人,即令人烦恼,又无法抛弃. 先上个例子,这个例子里的函数double输入一个非负整数$n$,输出$2n$. \[ {double} ...

  9. c/c++ 用普利姆(prim)算法构造最小生成树

    c/c++ 用普利姆(prim)算法构造最小生成树 最小生成树(Minimum Cost Spanning Tree)的概念: ​ 假设要在n个城市之间建立公路,则连通n个城市只需要n-1条线路.这时 ...

  10. 9. svg学习笔记-裁剪和蒙版

    裁剪 在svg中进行剪切,对整个svg元素而言,可以使用<svg>元素的viewbox属性,对于单个元素则可以使用<clipPath>元素.在单个图形元素上使用裁剪,可以在&l ...