直接插入排序算法:ArrayList实现和数组实现
直接插入排序算法思想:
- 排序区间
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实现和数组实现的更多相关文章
- 排序系列 之 折半插入排序算法 —— Java实现
基本思想: 折半插入算法是对直接插入排序算法的改进,排序原理同直接插入算法: 把n个待排序的元素看成一个有序表和一个无序表,开始时有序表中只有一个元素,无序表中有n-1个元素:排序过程即每次从无序表中 ...
- 插入排序算法--直接插入算法,折半排序算法,希尔排序算法(C#实现)
插入排序算法主要分为:直接插入算法,折半排序算法(二分插入算法),希尔排序算法,后两种是直接插入算法的改良.因此直接插入算法是基础,这里先进行直接插入算法的分析与编码. 直接插入算法的排序思想:假设有 ...
- PHP实现插入排序算法
插入排序(Insertion Sort),是一种较稳定.简单直观的排序算法.插入排序的工作原理,是通过构建有序序列,对于未排序的数据,在有序序列中从后向前扫描,找到合适的位置并将其插入.插入排序,在最 ...
- 《算法4》2.1 - 插入排序算法(Insertion Sort), Python实现
排序算法列表电梯: 选择排序算法:详见 Selection Sort 插入排序算法(Insertion Sort):非常适用于小数组和部分排序好的数组,是应用比较多的算法.详见本文 插入排序算法的语言 ...
- 【java集合框架源码剖析系列】java源码剖析之java集合中的折半插入排序算法
注:关于排序算法,博主写过[数据结构排序算法系列]数据结构八大排序算法,基本上把所有的排序算法都详细的讲解过,而之所以单独将java集合中的排序算法拿出来讲解,是因为在阿里巴巴内推面试的时候面试官问过 ...
- C/C++ -- 插入排序算法
索引: 目录索引 参看代码 GitHub: Sort.cpp 代码简要分析说明: 1.for(int i=1;i<nSize;i++) 这个外层的for循环, [0][1],[1][2],[2] ...
- 插入排序算法 Java实现
插入排序算法是算法排序中的一种: 该算法是假设已有序列是有序序列,从首元素(首元素为单个元素,肯定是有序的...)开始分析,对其他元素的位置进行有序的确定: 以算法为例: public class I ...
- 用 Java 实现一个插入排序算法
有一个已经有序的数据序列,要求在这个已经排好的数据序列中插入一个数,但要求插入后此数据序列仍然有序,这个时候就要用到一种新的排序方法:插入排序法.插入排序的基本操作就是将一个数据插入到已经排好序的有序 ...
- java 合并排序算法、冒泡排序算法、选择排序算法、插入排序算法、快速排序算法的描述
算法是在有限步骤内求解某一问题所使用的一组定义明确的规则.通俗点说,就是计算机解题的过程.在这个过程中,无论是形成解题思路还是编写程序,都是在实施某种算法.前者是推理实现的算法,后者是操作实现的算法. ...
随机推荐
- 上海依图-电话面试-angularjs
树的遍历(树结构:node.name,node.children),输出node.name(递归) 指令的scope的绑定策略(@绑定DOM数学单向绑定:=双向数据绑定:&绑定父作用域函数) ...
- 2018(上)C高级第0次作业
一:已关注邹欣老师的博客,以及一些任课老师的博客. 二:新学期新气象,走过基础C语言的学习,转眼间来到了C语言的高级学习... 1.翻阅邹欣老师博客关于师生关系博客,并回答下列问题. (1)最理想的师 ...
- C/C++生成随机数
一.rand和srand 在C++11标准出来之前,C/C++都依赖于stdlib.h头文件的rand或者srand来生成随机数. 其不是真正的随机数,是一个伪随机数,是根据一个数(我们可以称 ...
- Ubuntu登陆密码忘记
在VMware中安装了Ubuntu 10.04,经过了一段时间,再次登录的时候居然进不去了, 一开始不知道怎样在虚拟机中进入到Grub启动界面,网上搜索了一番,按照以下步骤重新为用户设定了新密码. 重 ...
- HTTP协议以及HTTP2.0/1.1/1.0区别
HTTP协议以及HTTP2.0/1.1/1.0区别 一.简介 摘自百度百科: 超文本传输协议(HTTP,HyperText Transfer Protocol)是互联网上应用最为广泛的一种网络协议.所 ...
- SELinux与进程管理
- day-1 用python编写一个简易的FTP服务器
从某宝上购买了一份<Python神经网络深度学习>课程,按照视频教程,用python语言,写了一个简易的FTP服务端和客户端程序,以前也用C++写过聊天程序,编程思路差不多,但是pytho ...
- 17-TypeScript代理模式
在有些情况下,我们需要把客户端真正调用的类和方法隐藏起来,而通过暴露代理类给客户端.客户端调用代理类的方式就可以访问到真实类提供的功能. abstract class Called{ protecte ...
- java截取一个字符串正数或倒数某个特定字符前后的内容
取出正数第二个“.”后面的内容 public class TestCode { public static void main(String[] args) { String str ="2 ...
- Thinkphp框架部署步骤
Thinkphp框架部署步骤 thinkphp框架部署起来简单,但是由于步骤较多也容易遗忘: 这是安装了集成环境后的一个www根目录结构: 然后需要在这个目录下面创建一个文件夹做项目:thinkphp ...