常见的排序算法



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

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

`

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. JUC之线程池基础

    线程池 定义和方法 线程池的工作时控制运行的线程数量,处理过程中将任务放入队列,然后在线程创建后启动这些任务,如果线程数量超过了最大数量,超出数量的线程排队等候,等待其他线程执行完成,再从队列中取出任 ...

  2. 带你学习Flood Fill算法与最短路模型

    一.Flood Fill(连通块问题) 0.简介 Flood Fill(洪水覆盖) 可以在线性的时间复杂内,找到某个点所在的连通块! 注:基于宽搜的思想,深搜也可以做但可能会爆栈 flood fill ...

  3. Java对象栈上分配

    转自 https://blog.csdn.net/o9109003234/article/details/101365108 在学习Java的过程中,很多喜欢说new出来的对象分配一定在对上: 其实不 ...

  4. go get失败解决办法

    go get时由于防火墙的原因,会导致失败.目前可以通过修改GOPROXY的方法解决该问题. 无论是在win下还是linux,macos下,只需要将环境变量GOPROXY设置成https://gopr ...

  5. cp 不提示按y

    yes|cp index.html.j2   yml -rf \cp index.html.j2   yml/ 两个效果是一样的

  6. 不难懂-------git版本回退

    1. git log 定义:该命令显示从最近到最远的提交日志.每一次提交都有对应的 commit id 和 commit message.   如果嫌弃输出的信息杂乱无章,那么加上 --pretty= ...

  7. nginx 和uwsgi的区别与作用

    在介绍nginx和uwsgi的区别和作用之前我们先介绍一下几个概念 1.WSGI WSGI的全称是Web Server Gateway Interface(Web服务器网关接口),它不是服务器.pyt ...

  8. react直接使用bootstrap失效的原因

    react用的是className!而不是class~

  9. Uwl.Admin.Core开源框架(二) 使用QuartzNet

    Uwl.Admin.Core中使用QuartzNet定时任务模块: 本文负责讲解RabbitMQ的使用 Uwl.Admin.Core使用的技术有: *.Async和Await 异步编程 *.Repos ...

  10. JAVA boolean 类型

    boolean 类型用来存储布尔值,在java中布尔值只有2个,true和false. boolean flag=true; flag=false;