常见的排序算法



今天复习【直接插入排序】

核心思想:有序数组中 找位置 -- 给无序数组第一个 找位置

`

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)的更多相关文章

  1. 八大排序算法总结与java实现(转)

    八大排序算法总结与Java实现 原文链接: 八大排序算法总结与java实现 - iTimeTraveler 概述 直接插入排序 希尔排序 简单选择排序 堆排序 冒泡排序 快速排序 归并排序 基数排序 ...

  2. [Data Structure & Algorithm] 八大排序算法

    排序有内部排序和外部排序之分,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存.我们这里说的八大排序算法均为内部排序. 下图为排序 ...

  3. 八大排序算法的 Python 实现

    转载: 八大排序算法的 Python 实现 本文用Python实现了插入排序.希尔排序.冒泡排序.快速排序.直接选择排序.堆排序.归并排序.基数排序. 1.插入排序 描述 插入排序的基本操作就是将一个 ...

  4. 八大排序算法Java实现

    本文对常见的排序算法进行了总结. 常见排序算法如下: 直接插入排序 希尔排序 简单选择排序 堆排序 冒泡排序 快速排序 归并排序 基数排序 它们都属于内部排序,也就是只考虑数据量较小仅需要使用内存的排 ...

  5. Python实现八大排序算法(转载)+ 桶排序(原创)

    插入排序 核心思想 代码实现 希尔排序 核心思想 代码实现 冒泡排序 核心思想 代码实现 快速排序 核心思想 代码实现 直接选择排序 核心思想 代码实现 堆排序 核心思想 代码实现 归并排序 核心思想 ...

  6. 八大排序算法详解(动图演示 思路分析 实例代码java 复杂度分析 适用场景)

    一.分类 1.内部排序和外部排序 内部排序:待排序记录存放在计算机随机存储器中(说简单点,就是内存)进行的排序过程. 外部排序:待排序记录的数量很大,以致于内存不能一次容纳全部记录,所以在排序过程中需 ...

  7. Java八大排序算法

    Java八大排序算法: package sort; import java.util.ArrayList; import java.util.Arrays; import java.util.List ...

  8. 【Python】八大排序算法的比较

    排序是数据处理比较核心的操作,八大排序算法分别是:直接插入排序.希尔排序.简单选择排序.堆排序.冒泡排序.快速排序.归并排序.基数排序 以下是排序图解: 直接插入排序 思想 直接插入排序是一种最简单的 ...

  9. 八大排序算法 JAVA实现 亲自测试 可用!

    今天很高兴 终于系统的实现了八大排序算法!不说了 直接上代码 !代码都是自己敲的, 亲测可用没有问题! 另:说一下什么是八大排序算法: 插入排序 希尔排序 选择排序 堆排序 冒泡排序 快速排序 归并排 ...

随机推荐

  1. SQL查询中关键字的执行顺序

    SQL语句中的每个关键字都按照顺序往下执行,而每一步操作会生成一个临时表,最后的临时表就是最终结果: FROM <left_table>:from子句返回初始结果集 <join_ty ...

  2. 字符串工具类ToStringBuilder常用方法介绍

    一.简介与引入   1.ToStringBuilder.HashCodeBuilder.EqualsBuilder.ToStringStyle.ReflectionToStringBuilder.Co ...

  3. 集合框架-工具类-Collections-排序

    1 package cn.itcast.p2.toolclass.collections.demo; 2 3 import java.util.ArrayList; 4 import java.uti ...

  4. Typecho博客支持emoji表情设置

    介绍 大家在typecho博客写文章时,很多人都喜欢使用emoji表情(比如这些图标)但是typecho的数据库类型默认不支持emoji编码,因为Emoji是一种在Unicode位于u1F601-u1 ...

  5. python网络爬虫-python基础(三)

    python安装 Anaconda的python科学计算环境,只需要想普通软件一样安装就可以把python的环境变量.解释器.开发环境都安装到计算机中 除此之外anaconda还提供众多的科学计算的包 ...

  6. webStorm关于ESlint6语法格式化解决方案

    方式1: 下载ESLint6 格式化插件(格式化蛋痛,有点卡,而且必须先保存) 方式2:更改快捷键 在设置中,将下面这个格式化选项设置快捷键即可 到设置中的下面这个选项找修改即可

  7. Ubuntu 18.04 安装教程

    准备材料 Ubuntu安装U盘 足够的硬盘空间 未初始化的硬盘需要提前初始化 注意事项 Ubuntu安装盘的制作请参考我的另外一个博客,里面写清楚了怎么制作Ubuntu安装盘,步骤非常简单 请将要拿给 ...

  8. CKKS加密方案

    本文内容来自"Protecting Privacy throughHomomorphic Encryption",主要学习里面的CKKS部分. CKKS是一种同态加密方案,其安全性 ...

  9. CentOS-7部署Docker容器

    为了适应当前容器化的部署方式,故最近也在对docker进行学习.目前的理解是docker服务就像一艘货船,而你的各项服务可以封装在一个个集装箱里,而且在docker里服务的启动非常快,故有必要从基础的 ...

  10. MAC OS 常用快捷键

    删除文件或文件夹 commond + delete 复制文件或文件夹 commond + c 粘贴文件或文件夹 commond + v