直接插入排序实现(Java)
直接插入排序介绍
直接插入排序的基本操作是将一个记录插入到已经排好序的有序表中,从而得到一个新的、记录数增1的有序表。
怎么理解呢?就是将n个待排序的元素看成一个有序表和一个无序表,开始时有序表中只有一个元素,无序表中有n-1个元素,排序过程中每次从无序表中取出第一个元素,将其插入到有序表中的指定位置,使之成为一个新的有序表,重复n-1次可完成排序过程。
直接插入排序流程说明
具体流程如下:
- 首先比较数组的前两个数据,并排序;
- 比较第三个元素与前两个排好序的数据,并将第三个元素放入适当的位置;
- 比较第四个元素与前三个排好序的数据,并将第四个元素放入适当的位置;
… - 直至把最后一个元素放入适当的位置。
代码实现:
public class InsertSort {
//置换
public void swap(int[] elem, int i, int j) {
int temp = elem[i];
elem[i] = elem[j];
elem[j] = temp;
}
public void insertSort(int[] elem) {
int i, j;
for (i = 2; i < elem.length; i++) {
if(elem[i] < elem[i - 1]) { //需要将elem[i]插入到有序子表
elem[0] = elem[i]; //设置哨兵
for (j = i - 1; elem[j] > elem[0]; j--) {
elem[j + 1] = elem[j]; //记录后移
}
elem[j + 1] = elem[0]; //插入到正确位置
}
}
}
public static void main(String[] args) {
InsertSort s = new InsertSort();
// int[] elem = {0, 9, 1, 5, 8, 3, 7, 4, 6, 2};
int[] elem2 = {0, 5, 3, 4, 6, 2};
s.insertSort(elem2);
for (int i = 1; i < elem2.length; i++) {
System.out.print(elem2[i] + ", ");
}
}
}
i从2开始的意思是我们假设elem[1]=5已经放好位置,后面的数据元素就是插入到它的左侧还是右侧的问题。
对于初始数据:{5, 3, 4, 6, 2}。
- 首先比较5和3的大小,3小,位置互换,第一轮排序后,顺序为:[3, 5, 4, 6, 2]。
- 对于第三个数据4,其大于3,小于5,将其插入3和5之间,顺序依旧为:[3, 4, 5, 6, 2]。
- 对于第四个数据6,其大于3,4,5,不需要插入,位置不变,顺序为:[3, 4, 5, 6, 2]。
- 对于第五个数据2,其小于于3,将其插入到3的前面,顺序为:[2, 3, 4, 5, 6,]。
直接插入排序复杂度分析
从空间上看只需要一个哨兵的辅助空间。
当最好的情况下,也就是表本身就是有序的,那么我们比较次数共计n-1(∑i=2n\sum_{i=2}^{n}∑i=2n)次,因为每次都是elem[i]>elem[i -1],所以没有移动记录,时间复杂度为O(n)
当最坏的情况下,即逆序情况下,此时需要比较(n+2)(n−1)2\frac{(n+2)(n-1)}{2}2(n+2)(n−1)次,而记录的移动次数也达到最大值(n+4)(n−1)2\frac{(n+4)(n-1)}{2}2(n+4)(n−1)次
如果排序记录是随机的,那么根据概率相同的原则,平均比较和移动次数约为n24\frac{n^2}{4}4n2次。因此我们得出直接插入排序的时间复杂度为O(n2n^2n2)。
同样的复杂度,直接插入排序比冒泡和简单选择排序性能要好。
直接插入排序实现(Java)的更多相关文章
- 直接插入排序之Java实现
直接插入排序之Java实现 一.方法一 package cn.com.zfc.lesson21.sort; import java.util.Arrays; /** * * @title Insert ...
- 排序系列 之 折半插入排序算法 —— Java实现
基本思想: 折半插入算法是对直接插入排序算法的改进,排序原理同直接插入算法: 把n个待排序的元素看成一个有序表和一个无序表,开始时有序表中只有一个元素,无序表中有n-1个元素:排序过程即每次从无序表中 ...
- 排序系列 之 直接插入排序算法 —— Java实现
直接插入排序算法 基本思想: 把n个待排序的元素看成一个有序表和一个无序表,开始时有序表中只有一个元素,无序表中有n-1个元素:排序过程即每次从无序表中取出第一个元素,将它插入到有序表中,使之成为新的 ...
- 插入排序算法java
转自https://blog.csdn.net/jianyuerensheng/article/details/51254415 1.基本思想 直接插入排序的基本操作是将一个记录插入到已经排好的有序表 ...
- 折半、快排、插入排序的Java实现
插入排序 import java.util.Arrays; public class InsertionSort { /** * 对数组里面进行插入排序 * 参数1 数组 * 参数2 数组大小 */ ...
- 排序算法系列:插入排序算法JAVA版(靠谱、清晰、真实、可用、不罗嗦版)
在网上搜索算法的博客,发现一个比较悲剧的现象非常普遍: 原理讲不清,混乱 啰嗦 图和文对不上 不可用,甚至代码还出错 我总结一个清晰不罗嗦版: 原理: 和选择排序类似的是也分成“已排序”部分,和“未排 ...
- 插入排序(java)
这星期java老师布置的作业就是实现几种常见的排序算法,由于数据结构学了丢得差不多了,今天晚上搞了一晚上才搞出来插入排序的三种算法. 首先说个与题目不搭的话,今天写
- 插入排序 思想 JAVA实现
已知一个数组 60.28.41.39.6 .18 .14.28.49.31 利用插入排序算法进行排序 插入排序是一个运行时间为O(N²)的排序算法. 算法思想 60.28.41.39.6 .18 . ...
- 插入排序算法Java实现
一. 算法描述 插入即表示将一个新的数据插入到一个有序数组中,并继续保持有序.例如有一个长度为N的无序数组,进行N-1次的插入即能完成排序:第一次,数组第1个数认为是有序的数组,将数组第二个元素插入仅 ...
- 直接插入排序(java实现)
这几天看排序算法,网上大多数排序算法的解释都是“过于专业”,导致一时半会看不明白到底在说什么玩意.现在总结下几大排序算法(java实现) 1.直接插入排序 说的简单点,就是一组无序序列{A1,A2,. ...
随机推荐
- 使用JDBC连接MySql时出现:The server time zone value '�й���ʱ��' is unrecognized or represents more than one time zone. You must configure either the server or JDBC driver (via the serverTimezone configuration
在连接字符串后面加上?serverTimezone=UTC 其中UTC是统一标准世界时间. 完整的连接字符串示例:jdbc:mysql://localhost:3306/test?serverTime ...
- CentOS7下安装配置Nginx
一:安装依赖项 1.pcre:2.openssl:3.zlib:4.gcc:可直接通过yum安装 二:创建nginx账户(可以配置nginx.conf的user为此账户) useradd nginx ...
- webuploader传递参数
实际开发过程中,比如我有个工单提交系统,提交工单的时候用webuploader上传图片,如果工单的ID是自增长类型的,那么我在上传图片的时候肯定需要关联上工单的id,这时候就需要通过webupload ...
- NSString NSMutableString
// NSString //代开API文档 //Xcode -> help - Documentation and API Reference ...
- hdu 2845 Beans 2016-09-12 17:17 23人阅读 评论(0) 收藏
Beans Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Subm ...
- 树和二叉树在java中
树代表一种非线性的数据结构,如果一组数组节点之间存在复杂的一对多关联时,程序就可以考虑使用树来保存这组数据了. 线性表.栈和队列都是线性的数据结构,这种数据结构之内的元素只存在一个对一个的关系.存储, ...
- 【PAT Advanced Level】1014. Waiting in Line (30)
简单模拟题,注意读懂题意就行 #include <iostream> #include <queue> using namespace std; #define CUSTOME ...
- 团队项目(HCL队)第二周
一.项目介绍 1.内容 我们队选择的题目是经典90坦克大战的java实现,后续会加入ai,以实现更丰富的体验. 2.预期使用数量 原版的经典90坦克大战拥有众多粉丝,我们在其上进行拓展,目前预计用户量 ...
- [翻译]NUnit---Property and Random Attributes(十四)
小记:由于工作琐碎,没得心情翻译而且也在看<CLR vis C#>,所以断更了差不多5个月,现在继续翻译,保证会翻译完成,不会虎头蛇尾. 另:NUnit已经更新到2.6.3版本,虽然正在开 ...
- 【C#进阶】委托那些事儿(一)
一.简单的委托 1.1 委托的声明: C#当中,委托(delegate)是一种方法封装,也即委托对象可以作为一种传递方法的变量来使用. 委托也算是一种类,与类是平级的存在.在类中写delegate对象 ...