转载请注明出处,谢谢!

直接插入排序算法思想:

  • 排序区间R[1..n];
  • 在排序的过程中,整个排序区间被分为两个子区间: 有序区R[ 1 ... i-1 ]和无序区R[ i ... n ];
  • 共进行n-1趟排序,每趟排序都是把无序区的第一条记录Ri插到有序区的合适位置上。

插入排序

  • 直接插入排序
  • 折半插入排序
  • 二路插入排序
  • 希尔排序

算法说明

  • 对于随机排列的长度为\(N\)且主键不重复的数组:

    • 平均情况下需要\(~\frac{N^2}{4}\)次比较及\(~\frac{N^2}{4}\)次交换。
    • 最坏情况下需要\(~\frac{N^2}{2}\)次比较及\(~\frac{N^2}{2}\)次交换。
    • 最好情况下需要\(N-1\)次比较及\(0\)次交换。
  • 适用环境:

    * 适用于少量元素,且几乎有序的序列。

ArrayList实现:

import java.util.ArrayList;
import java.util.Random; public class Charupaixu { ArrayList<Integer> al; public Charupaixu(int num, int bound) {
al = new ArrayList<>(num);
// 创建一个随机数生成器
Random rand = new Random();
// 添加1-100的随机整数
for (int i = 0; i < num; i++) {
al.add(new Integer(Math.abs(rand.nextInt(bound))+1));
}
System.out.println("The ArrayList Sort Before:\n" + al);
} public void ZJCRSortIt() {
System.out.println("Sorting :");
Integer tempInt; for (int i = 1; i < al.size(); i++) {
// 将a[i]插入到a[i-1] a[i-2] a[i-3] ... 中
for (int j = i; j > 0 && (al.get(j) < al.get(j - 1)); j--) {
tempInt = al.remove(j);
al.add(j - 1, tempInt);
System.out.println(al);
}
}
} public static void main(String[] args) {
Charupaixu cr = new Charupaixu(10, 100);
cr.ZJCRSortIt();
} } Output: The ArrayList Sort Before:
[10, 75, 61, 50, 17, 60, 19, 7, 73, 87]
Sorting :
[10, 75, 61, 50, 17, 60, 19, 7, 73, 87]
[10, 61, 75, 50, 17, 60, 19, 7, 73, 87]
[10, 50, 61, 75, 17, 60, 19, 7, 73, 87]
[10, 17, 50, 61, 75, 60, 19, 7, 73, 87]
[10, 17, 50, 60, 61, 75, 19, 7, 73, 87]
[10, 17, 19, 50, 60, 61, 75, 7, 73, 87]
[7, 10, 17, 19, 50, 60, 61, 75, 73, 87]
[7, 10, 17, 19, 50, 60, 61, 73, 75, 87]
[7, 10, 17, 19, 50, 60, 61, 73, 75, 87]

数组实现:

int[] a={ 50, 15, 18, 8, 40, 51, 60, 1, 1, 20, 15 };
System.out.println("The ArrayList Before Sort is:");
for (int k = 0; k < a.length; k++) {
System.out.print(a[k]+", ");
} System.out.println("\nSorting:"); for(int i = 1;i<a.length;i++){ int temp = a[i];
int j; for (j = i; (j >0) && (a[j-1] > temp); j--) {
a[j]=a[j-1];
} a[j]=temp; for (int k = 0; k < a.length; k++) {
System.out.print(a[k]+", ");
} System.out.println();
} Output: The ArrayList Before Sort is:
50, 15, 18, 8, 40, 51, 60, 1, 1, 20, 15,
Sorting:
15, 50, 18, 8, 40, 51, 60, 1, 1, 20, 15,
15, 18, 50, 8, 40, 51, 60, 1, 1, 20, 15,
8, 15, 18, 50, 40, 51, 60, 1, 1, 20, 15,
8, 15, 18, 40, 50, 51, 60, 1, 1, 20, 15,
8, 15, 18, 40, 50, 51, 60, 1, 1, 20, 15,
8, 15, 18, 40, 50, 51, 60, 1, 1, 20, 15,
1, 8, 15, 18, 40, 50, 51, 60, 1, 20, 15,
1, 1, 8, 15, 18, 40, 50, 51, 60, 20, 15,
1, 1, 8, 15, 18, 20, 40, 50, 51, 60, 15,
1, 1, 8, 15, 15, 18, 20, 40, 50, 51, 60,

——@guoyangde http://www.cnblogs.com/LittleTreasureBox/p/8904016.html

直接插入排序算法:ArrayList实现和数组实现的更多相关文章

  1. 排序系列 之 折半插入排序算法 —— Java实现

    基本思想: 折半插入算法是对直接插入排序算法的改进,排序原理同直接插入算法: 把n个待排序的元素看成一个有序表和一个无序表,开始时有序表中只有一个元素,无序表中有n-1个元素:排序过程即每次从无序表中 ...

  2. 插入排序算法--直接插入算法,折半排序算法,希尔排序算法(C#实现)

    插入排序算法主要分为:直接插入算法,折半排序算法(二分插入算法),希尔排序算法,后两种是直接插入算法的改良.因此直接插入算法是基础,这里先进行直接插入算法的分析与编码. 直接插入算法的排序思想:假设有 ...

  3. PHP实现插入排序算法

    插入排序(Insertion Sort),是一种较稳定.简单直观的排序算法.插入排序的工作原理,是通过构建有序序列,对于未排序的数据,在有序序列中从后向前扫描,找到合适的位置并将其插入.插入排序,在最 ...

  4. 《算法4》2.1 - 插入排序算法(Insertion Sort), Python实现

    排序算法列表电梯: 选择排序算法:详见 Selection Sort 插入排序算法(Insertion Sort):非常适用于小数组和部分排序好的数组,是应用比较多的算法.详见本文 插入排序算法的语言 ...

  5. 【java集合框架源码剖析系列】java源码剖析之java集合中的折半插入排序算法

    注:关于排序算法,博主写过[数据结构排序算法系列]数据结构八大排序算法,基本上把所有的排序算法都详细的讲解过,而之所以单独将java集合中的排序算法拿出来讲解,是因为在阿里巴巴内推面试的时候面试官问过 ...

  6. C/C++ -- 插入排序算法

    索引: 目录索引 参看代码 GitHub: Sort.cpp 代码简要分析说明: 1.for(int i=1;i<nSize;i++) 这个外层的for循环, [0][1],[1][2],[2] ...

  7. 插入排序算法 Java实现

    插入排序算法是算法排序中的一种: 该算法是假设已有序列是有序序列,从首元素(首元素为单个元素,肯定是有序的...)开始分析,对其他元素的位置进行有序的确定: 以算法为例: public class I ...

  8. 用 Java 实现一个插入排序算法

    有一个已经有序的数据序列,要求在这个已经排好的数据序列中插入一个数,但要求插入后此数据序列仍然有序,这个时候就要用到一种新的排序方法:插入排序法.插入排序的基本操作就是将一个数据插入到已经排好序的有序 ...

  9. java 合并排序算法、冒泡排序算法、选择排序算法、插入排序算法、快速排序算法的描述

    算法是在有限步骤内求解某一问题所使用的一组定义明确的规则.通俗点说,就是计算机解题的过程.在这个过程中,无论是形成解题思路还是编写程序,都是在实施某种算法.前者是推理实现的算法,后者是操作实现的算法. ...

随机推荐

  1. Flume日志采集系统

    1.简介 Flume是Cloudera提供的一个高可用.高可靠.分布式的海量日志采集.聚合和传输的系统. Flume支持在日志系统中定制各类数据发送方用于收集数据,同时Flume提供对数据进行简单的处 ...

  2. hibernate框架学习笔记10:HQL查询详解

    HQL语句中不可以出现与表有关的内容,而是对象的属性 实体类(注意配置文件): package domain; import java.util.HashSet; import java.util.S ...

  3. Alpha冲刺博客集

    传送门 冲刺随笔 Alpha冲刺day1 (10.31):第一天博客地址 Alpha冲刺day2 (11.01):第二天博客地址 Alpha冲刺day3 (11.02):第三天博客地址 Alpha冲刺 ...

  4. 201621123050 《Java程序设计》第12周学习总结

    1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多流与文件相关内容. 2. 面向系统综合设计-图书馆管理系统或购物车 使用流与文件改造你的图书馆管理系统或购物车. 2.1 简述如何 ...

  5. 20155303 2016-2017-2 《Java程序设计》第二周学习总结

    20155303 2016-2017-2 <Java程序设计>第二周学习总结 教材学习内容总结 『注意』 "//"为单行批注符: "/*"与&quo ...

  6. 201621123068 作业07-Java GUI编程

    1. 本周学习总结 1.1 思维导图:Java图形界面总结 2.书面作业 1. GUI中的事件处理 1.1 写出事件处理模型中最重要的几个关键词. 注册.事件.事件源.监听 1.2 任意编写事件处理相 ...

  7. fread函数详解

    函数原型: size_t   fread(   void   *buffer,   size_t   size,   size_t   count,   FILE   *stream   )    b ...

  8. maven创建web工程

    使用eclipse插件创建一个web project 首先创建一个Maven的Project如下图 我们勾选上Create a simple project (不使用骨架) 这里的Packing 选择 ...

  9. html{font-size:62.5%}

    为什么要使用html,body{font-size:62.5%}? 使用以下代码查看浏览器的初始font-size: <!DOCTYPE html><html><head ...

  10. Node入门教程(2)第一章:NodeJS 概述

    Node 概述 什么是 Node Node.js® is a JavaScript runtime built on Chrome's V8 JavaScript engine. Node.js us ...