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. uni-app 子组件如何调用父组件的方法

    1.在父组件methods中定义一个方法: changeType:function(type){ this.typeActive = type; alert(type); } 2.在父组件引用子组件时 ...

  2. 微信小程序-全国快递查询

    微信小程序-全国快递查询 摘要:WeChat.小程序.JS 开发过程 源码下载 1. GitHub 2. 百度云 链接:https://pan.baidu.com/s/1XVbtT2JsZslg4Y0 ...

  3. 制作OTA升级包

    OTA 软件包工具 本文地址http://wossoneri.github.io/2018/09/21/%5BAndroid%5D%5BFramework%5Dcreate-ota-update-zi ...

  4. weui textarea超出字符被截断

    HTML: <div class="weui-cells weui-cells_form" style="margin-top: 0;"> < ...

  5. Jenkins 配置CI/CD任务

    本文演示如何通过Jenkins创建CI/CD任务,部署一整套微服务体系结构,并运行在之前搭建的mini云平台上. 如果是初始尝试实践,可能需要参考 快速搭建云原生架构的实践环境 和 Jhipster技 ...

  6. shell编程-输出(六)

    echo输出echo指令用于字符串的输出 格式:echo 字符串 直接输出字符串:string echo 'this is string-output' 用双引号,这儿也可以省略引号 转义字符:\ e ...

  7. replace函数使用方法

    Replace函数的含义~ 用新字符串替换旧字符串,而且替换的位置和数量都是指定的. replace函数的语法格式 =Replace(old_text,start_num,num_chars,new_ ...

  8. python3中list列表的一些操作

    最近遇到许多List的操作,感觉它是一种很重要的一种基础数据结构,本人掌握的也不是很扎实,这里找了一些列表的操作,常用函数,记录下来,希望对大家有用.如果理解有偏差,欢迎指正,感谢! (1)列表的合并 ...

  9. 为爱好舞蹈的人们做的软件,细究数据结构,操作系统,磁盘原理,用java/c/c++写一个开源 MP3助手

    1.可以给歌曲间插播空白音乐 2.拖拽式调整 3.先排序,后一键写入顺序文件. 国外的开源软件 MP3 播放排序  http://www.murraymoffatt.com/software-prob ...

  10. shell 关于路径查询显示pwd

    获取根目录:dirname $0 cd到根目录:cd `dirname $0` 获取当前目录:pwd 因此,要获取当前目录应该是: cd `dirname $` && pwd 或者 $ ...