八大排序算法之直接插入排序(InsertionSort)
常见的排序算法

今天复习【直接插入排序】
核心思想:有序数组中 找位置 -- 给无序数组第一个 找位置
`
public class InsertionSort {
// 核心思想:有序数组中 找位置 -- 给无序数组第一个 找位置
public void myInsertSort(int[] arr) {
int len = arr.length;
for (int i = 1; i < len; i++) {
// 查找位置插入 -- 可能存在二分查找进行优化
int toInsert = arr[i];
int toPos = 0;
while (arr[toPos] <= toInsert && toPos < i) {
toPos++;
}
// 插入到 toPos 位置
if (toPos != i) {
System.arraycopy(arr, toPos, arr, toPos + 1, i - toPos);
arr[toPos] = toInsert;
}
}
}
// 针对位置插入 从后向前 边判断大小,边移动元素
public void insertSortOpt(int[] arr) {
int len = arr.length;
for (int i = 1; i < len; i++) {
// 从后往前移动元素
int toInsert = arr[i];
for (int pos = i; pos >= 0; pos--) {
if (pos > 0 && arr[pos - 1] > toInsert) {
arr[pos] = arr[pos - 1];
} else {
arr[pos] = toInsert;
break;
}
}
// 这种情况 解决不了插入位在第 0 位的情况
// for (int pos = i - 1; pos >= 0; pos--) {
// if (arr[pos] > toInsert) {
// arr[pos + 1] = arr[pos];
// } else {
// arr[pos + 1] = toInsert;
// break;
// }
// }
}
}
public void insertSortSwap(int[] arr) {
// 此刻 i 标记的有序数组最后一位
for (int i = 0; i < arr.length - 1; i++) {
for (int j = i + 1; j > 0; j--) {
if (arr[j] >= arr[j - 1]) {
break;
}
// 交换
int tmp = arr[j];
arr[j] = arr[j - 1];
arr[j - 1] = tmp;
}
}
}
public void insertSortBinary(int[] arr) {
for (int i = 1; i < arr.length; i++) {
// 通过二分 查找插入位置
// 边界 0、i两种情况,返回何值比较合适
int toInset = arr[i];
int pos = binarySearch(arr, i - 1, toInset);
if (pos != i) {
System.arraycopy(arr, pos, arr, pos + 1, i - pos);
arr[pos] = toInset;
}
}
}
public int binarySearch(int[] arr, int end, int key) {
int left = 0;
int right = end;
while (left <= right) {
int mid = (left + right) >>> 1;
if (key >= arr[mid]) {
left = mid + 1;
} else {
right = mid - 1;
}
}
return left;
}
public static void main(String[] args) {
InsertionSort testClass = new InsertionSort();
int[] arr = new int[]{49, 38, 65, 97, 76, 13, 27, 49, 55, 4};
testClass.insertSortBinary(arr);
System.out.println(Arrays.toString(arr));
}
}
`
八大排序算法之直接插入排序(InsertionSort)的更多相关文章
- 八大排序算法总结与java实现(转)
八大排序算法总结与Java实现 原文链接: 八大排序算法总结与java实现 - iTimeTraveler 概述 直接插入排序 希尔排序 简单选择排序 堆排序 冒泡排序 快速排序 归并排序 基数排序 ...
- [Data Structure & Algorithm] 八大排序算法
排序有内部排序和外部排序之分,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存.我们这里说的八大排序算法均为内部排序. 下图为排序 ...
- 八大排序算法的 Python 实现
转载: 八大排序算法的 Python 实现 本文用Python实现了插入排序.希尔排序.冒泡排序.快速排序.直接选择排序.堆排序.归并排序.基数排序. 1.插入排序 描述 插入排序的基本操作就是将一个 ...
- 八大排序算法Java实现
本文对常见的排序算法进行了总结. 常见排序算法如下: 直接插入排序 希尔排序 简单选择排序 堆排序 冒泡排序 快速排序 归并排序 基数排序 它们都属于内部排序,也就是只考虑数据量较小仅需要使用内存的排 ...
- Python实现八大排序算法(转载)+ 桶排序(原创)
插入排序 核心思想 代码实现 希尔排序 核心思想 代码实现 冒泡排序 核心思想 代码实现 快速排序 核心思想 代码实现 直接选择排序 核心思想 代码实现 堆排序 核心思想 代码实现 归并排序 核心思想 ...
- 八大排序算法详解(动图演示 思路分析 实例代码java 复杂度分析 适用场景)
一.分类 1.内部排序和外部排序 内部排序:待排序记录存放在计算机随机存储器中(说简单点,就是内存)进行的排序过程. 外部排序:待排序记录的数量很大,以致于内存不能一次容纳全部记录,所以在排序过程中需 ...
- Java八大排序算法
Java八大排序算法: package sort; import java.util.ArrayList; import java.util.Arrays; import java.util.List ...
- 【Python】八大排序算法的比较
排序是数据处理比较核心的操作,八大排序算法分别是:直接插入排序.希尔排序.简单选择排序.堆排序.冒泡排序.快速排序.归并排序.基数排序 以下是排序图解: 直接插入排序 思想 直接插入排序是一种最简单的 ...
- 八大排序算法 JAVA实现 亲自测试 可用!
今天很高兴 终于系统的实现了八大排序算法!不说了 直接上代码 !代码都是自己敲的, 亲测可用没有问题! 另:说一下什么是八大排序算法: 插入排序 希尔排序 选择排序 堆排序 冒泡排序 快速排序 归并排 ...
随机推荐
- Golang 记录
Golang 笔记 1. hello Golang 新建项目,推荐GoLand工具 GOPATH目录:D:\go\awesomeProject 三个标准目录:bin,pkg,src MAIN目录:D: ...
- springMvc 启动过程
转载自https://www.jianshu.com/p/dc64d02e49ac 这里给出一个简洁的文字描述版SpringMVC启动过程: tomcat web容器启动时会去读取web.xml这样的 ...
- 阐述JDBC操作数据库的步骤
1. 加载驱动. Class.forName("oracle.jdbc.driver.OracleDriver"); (注意:加载驱动在JDBC 4.0中是可以省略的,自动从类路径 ...
- Mongodb全备+增备+oplog恢复误删数据
此时测试表中有7条数据,做个全备. 全备: mongodump --host=192.168.43.43 --port=37017 --oplog --out=/opt/mongo/fullbacku ...
- 手把手教你用Strace诊断问题
手把手教你用Strace诊断问题 发表于2015-10-16 早些年,如果你知道有个 strace 命令,就很牛了,而现在大家基本都知道 strace 了,如果你遇到性能问题求助别人,十有八九会建议你 ...
- ES入门三部曲:索引操作,映射操作,文档操作
ES入门三部曲:索引操作,映射操作,文档操作 一.索引操作 1.创建索引库 #语法 PUT /索引名称 { "settings": { "属性名": " ...
- springcloud 负载均衡之 ribbon。
一.什么是 ribbon? 就是负载均衡! nginx也是负载均衡 1.1 !!!!ribbon和nginx的区别是什么? /* nginx: 正向代理(和客户端连在一起) 反向代理(和服务器端连在一 ...
- 计算机网络再次整理————tcp例子前奏[三]
前言 简单编写一下tcp例子. 正文 我们常说IOS有7层,实际上也只有4层,或者这样说简单的说是4层. 首先是数据链路层,首先这一层解决了什么问题呢?为什么要有这一层呢? 首先要抛开有操作系统的意识 ...
- Codeforces Round #741 (Div. 2)
全部题目跳转链接 A - The Miracle and the Sleeper 题意 给定\([l, r]\) 求出在这个区间内的两个数字a和b的取模的最大值 (\(a \ge b\)) 分析 上届 ...
- RefactoringGuru 代码异味和重构技巧总结
整理自 RefactoringGuru 代码异味 --什么?代码如何"闻味道"?? --它没有鼻子...但它肯定会发臭! 代码膨胀 [代码膨胀]是代码.方法和类,它们的规模已经增加 ...