package com.algorithm;

/**
 * 插入排序及其变体
 * 
 * List可转化为数组进行排序
 * Object数组中的元素必须实现Comparable接口,即元素必须是可比的
 */
public class InsertSort {

/**
* 直接插入排序
*/
public static void insertSort(Object[] a){
Object cur = null; //保存当前遍历到的元素
int len = a.length;
for(int i = 1;i < len;i++){
if(((Comparable)a[i]).compareTo(a[i-1]) < 0){ //如果后一个元素小于前一个
cur = a[i];
a[i] = a[i-1];
int j;
//在前面已经有序的表中查找插入位置,并移动元素
for(j = i-2;j>=0 && ((Comparable)cur).compareTo(a[j]) < 0;j--){
a[j+1] = a[j];
}
a[j+1] = cur;
}
}
}

/**
* 二分插入排序
* 使用二分查找查找插入位置时因为前面元素都已经有序
* 减小查找插入位置的比较次数,但元素移动次数不变
*/
public static void binaryInsertSort(Object[] a){
Object cur = null;
int len = a.length;
for(int i=1;i<len;i++){
if(((Comparable)a[i]).compareTo(a[i-1]) < 0){ //后一个元素小于前一个
cur = a[i];
int low = 0; //下界
int high = i - 1;
while(low <= high){ //找插入位置的索引
int mid = (low + high) / 2;
if(((Comparable)cur).compareTo(a[mid]) < 0){
high = mid - 1;
}else{
low = mid +1;
}
}
for(int j = i -1;j > high;j--){ //把high之后的元素右移
a[j+1] = a[j];
}
a[ high + 1] = cur;
}
}
}

/**
* 2-路插入排序
* 需要一个辅助数组s,及指向s的第一个及最后一个位置的索引,first和last,
* 即从first遍历到final得到的列是有序的
* 2-路插入排序是在二分插入排序的基础上进行改进,
* 减少了排序过程中移动的元素的次数,但增加了辅助空间.

*/
public static void twoRoadInsertSort(Object[] a){
int len = a.length;
Object[] s = new Object[len]; //辅助数组
s[0] = a[0];
int first = len;
int last = 0;
for(int i = 1;i < len;i++){
if(((Comparable)a[i]).compareTo(s[0])<0){  //小于s[0],插入到s[0]之前,即从数组最后开始插入
int j;
for(j = first; j < len - 1 && ((Comparable)a[i]).compareTo(s[j])>0;j++){
s[j-1] = s[j];
}
s[j-1] = a[i];
first--;
}else{ //大于s[0],插入到s[0]之后
int j;
//查找插入位置并移动元素
for(j = last; j > 0 && ((Comparable)a[i]).compareTo(s[j])<0;j--){
s[j+1] = s[j];
}
s[j+1] = a[i];
last++;
}
}
System.out.println("first:"+first +" last:"+last);
//重新对a赋值
int count = 0;
for(int i = first;i < len;i++){
a[count++] = s[i];
}
for(int i=0;i<=last;i++){
a[count++] = s[i];
}
}

//test
public static void main(String[] args) {
Integer[] data = {49,38,65,97,76,13,27,49,14};
insertSort(data);
//binaryInsertSort(data);
//twoRoadInsertSort(data);
for(Integer d:data){
System.out.println(d);
}
}
}

java中的排序算法——插入排序详解相关推荐

  1. android studio插入数据表中没有_学Java能拿高薪吗 Java中常见排序算法有哪些

    学Java能拿高薪吗?Java中常见排序算法有哪些?作为老牌编程语言,Java拥有广阔的市场占有率,几乎90%以上的大中型互联网应用系统在服务端开发都会首选Java.为了加入到Java这一高薪行业,很 ...

  2. Java中的异常和处理详解

    Java中的异常和处理详解 参考文章: (1)Java中的异常和处理详解 (2)https://www.cnblogs.com/lulipro/p/7504267.html 备忘一下.

  3. Java中Lambda表达式使用及详解

    Java中Lambda表达式使用及详解 前言 一.Lambda表达式的简介 Lambda表达式(闭包):java8的新特性,lambda运行将函数作为一个方法的参数,也就是函数作为参数传递到方法中.使 ...

  4. 【Java】基础排序算法-插入排序

    基础排序算法-------插入排序 实现过程: 插入排序的过程就像整理桥牌的过程:每次将待排元素中的第一个元素插入到有序区间的合适位置,为了给当前待排元素腾出位置,需要将有序区间内所有大于待排元素的其 ...

  5. 七大排序算法—图文详解(插入排序,希尔排序,选择排序,堆排序,冒泡排序,快速排序,归并排序)

    作者:渴望力量的土狗 博客主页:渴望力量的土狗的博客主页 专栏:数据结构与算法 工欲善其事必先利其器,给大家介绍一款超牛的斩获大厂offer利器--牛客网 点击免费注册和我一起刷题吧 目录 插入排序: ...

  6. pythonsort函数时间复杂度_合并排序算法——时间复杂度详解和python代码实现

    递归形式 递归形式是算法中常用到的一种构造思路.递归允许函数或过程对自身进行调用,是对算法中重复过程的高度概括,从本质层面进行刻画,避免算法书写中过多的嵌套循环和分支语法.因此,是对算法结构很大的简化 ...

  7. Java中各个排序算法比较

    之前我在javase基础中初步了解了一下冒泡排序,现在想根据创建的排序算法总结出它们在各方面的优劣性. 下图为java常见的几种排序: 之前我们在刘老师的数据结构课程上也有学过时间复杂度和空间复杂度的 ...

  8. Java中Unsafe类的原理详解与使用案例

    点击关注公众号,利用碎片时间学习 1 概述 本文基于JDK1.8. Unsafe类位于rt.jar包,Unsafe类提供了硬件级别的原子操作,类中的方法都是native方法,它们使用JNI的方式访问本 ...

  9. java中的排序算法——归并排序

    为什么使用归并排序? java中的Arrays.sort(Object[] o)是对数组进行排序,它使用的是归并排序的方式,  快速排序要比归并排序更快一些,但为什么使用归并排序了?原因是归并排序是一 ...

最新文章

  1. Storyboard中segue使用总结
  2. jq中查找上级_必备实用技能:在EXCEL中制作下拉菜单
  3. 基于SU的快速傅里叶变换(FFT)
  4. 数据库,部分函数依赖,传递函数依赖,完全函数依赖,三种范式的区别
  5. 应用题分析思路--关注点分离
  6. fir.im Weekly - 技术人也要苦练“七十二变”
  7. HeadFirstJava 11异常处理
  8. 计划策略10、11、40
  9. 如何搭建Flash P2P网络直播点播平台
  10. JavaScript/js 转 Python 代码转换神器 jiphy
  11. 视频教程-计算机二级公共基础(知识点与真题)-计算机等级考试
  12. 我最喜欢的10个顶级数据科学资源,kaggle、TDS、arXiv......
  13. 图形处理之网格平滑vtkSmoothPolyDataFilter
  14. Xenon's Attack on the Gangs(树规)
  15. 163.net邮箱,让海外邮件收发畅通无阻
  16. #三、回测试验给我们的启示
  17. 电子调谐器的主要引脚及作用
  18. 小微企业——信贷政策分析
  19. ACCESS常见的一些问题及解决的方法
  20. 佳能相机照片误删怎么恢复?看看我是如何在10分钟内解决的

热门文章

  1. Android 控件布局常用属性
  2. 云服务器ecs的特点有什么
  3. workerman介绍
  4. 把一个ListT的数据复制至另一个ListT
  5. 从机器学习谈起(机器学习简介)
  6. 请编程实现:产生一个int数组,长度为100,并向其中随机插入1-100,并且不能重复(百度了一下,get一种高性能算法,非递归)...
  7. 通过HTTP协议上传文件
  8. 打造自己的数据访问层(二)
  9. [收集]Visual C#中调用Windows API
  10. C语言内存泄露很严重该怎么办?这几招告诉你