直接插入排序算法: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 合并排序算法、冒泡排序算法、选择排序算法、插入排序算法、快速排序算法的描述
算法是在有限步骤内求解某一问题所使用的一组定义明确的规则.通俗点说,就是计算机解题的过程.在这个过程中,无论是形成解题思路还是编写程序,都是在实施某种算法.前者是推理实现的算法,后者是操作实现的算法. ...
随机推荐
- Eclipse配置类似sublime的黑色主题
另一篇中,详细介绍了如何使用Eclipse+Pydev搭建Python环境,传送门:http://www.cnblogs.com/BH8ANK/p/8688110.html 下面介绍下如何在Eclip ...
- 读论文系列:Object Detection CVPR2016 YOLO
CVPR2016: You Only Look Once:Unified, Real-Time Object Detection 转载请注明作者:梦里茶 YOLO,You Only Look Once ...
- C语言程序设计(基础)- 第4周作业
一.PTA作业 完成PTA第四周作业中8个题目,并将其中4个题目的思路列在博客中. 1.7-1 计算分段函数[1] 2.7-2 A除以B 3.7-6 阶梯电价 4.7-7 出租车计价 随笔具体书写内容 ...
- Ionic3的HTTP请求方法
Ionic的http请求方法,一种是使用Ionic的Native的Http方法,另一种是使用Angular的Http请求方法. 第一种真的是看着文档都实现不了,很奇怪的错(官网文档:https://i ...
- django搭建web (四) models.py
demo 该demo模型主要是用于问题,选择单个或多个答案的问卷形式应用 # -*- coding: utf-8 -*- from __future__ import unicode_literals ...
- xShell终端下中文乱码问题
今天,可能是因为不小心中途打断了xShell更新,结果打开xShell发现里面的中文全成了乱码.于是去网上查了一下原因. 更新xshell(xshell5)以及其他终端中文乱码的原因无非有三种 (1 ...
- python之路--day8---day9--两日内容
一.不使用函数的问题 1,代码的组织结构不清晰,可读性差 2,遇到重复的功能只能重复编写实现代码,代码冗余 3,功能需要扩展时,需要找出所有实现该功能的地方修改,无法统一管理且维护难度极大 二.函数是 ...
- 为什么 asnyc await 可以提高web程序的吞吐量
(转网上一段话) Web程序天生就是多线程的,且web线程都是跑的线程池线程(使用线程池线程是为了避免不断创建.销毁线程所造成的资源成本浪费),而线程池线程可使用线程数量是一定的,尽管可以设置,但它还 ...
- 使用 HttpClient 请求 Web Api
1.获取 post 请求 body 内容 [HttpPost] public string GetId() { //如果方法参数里面有 [FromBody],则需要重新调整内容指针,再进行读取. // ...
- 点击一次按钮,发生多次ajax请求
项目中遇到了两种情况: 1.点击一次发生两次请求. 原因:submit类型的按钮,默认有提交行为,发生两次提交的原因是在执行完ajax请求后,并没有阻止submit的行为,所以解决方法有两种: a.不 ...