一、声明

  算法思路部分借鉴于《算法导论》(第三版),实现过程均属作者原创,转载或引用请注明出处。

二、算法概述

插入排序算法适用于少量元素的排序。插入排序的过程就好比排序一副扑克牌。开始时,左手为空并且桌子上的牌面朝下。然后,每次从桌子上拿走一张扑克牌并将它插入左手中正确的位置。为了找到牌的正确位置,需要从右开始将它与已在手中的每张牌进行比较。每次插入结束后左手中的牌总是排序好的。

三、算法思路

1.位码实现

INSERTION-SORT(A)for j = 2 to A.lengthkey = A[j]    // 将桌面的牌拿至右手i = j -1     // 左手中已经排序好的牌的数量while i > 0 and A[i] > key    // 将右手中的key牌与左手中的牌从右到左进行比较A[i+1] = A[i]i = i - 1A[i+1] = key    // 将右手中的牌插入到左手中

四、算法分析

  最坏情况的运行时间为Θ(n^2),所以不适合大量输入的排序。

五、算法实现

1.InsertionSort类

  InsertSort是抽象类,需要实例化时需要实现public abstract int elemCompare(T a, T b)方法,此方法描述了比较类型T两个实例大小的策略。调用srot方法即可对ArrayList<T>进行插入排序。

import java.util.ArrayList;
/** * 作者原创,引用请注明出处 * @author ChameleonChen */
public abstract class InsertionSort<T> {public static final int A_GREATER_THAN_B = 1;public static final int A_LESS_THAN_B = 2;public static final int A_EQUALS_B = 3;/*** 实现a b 两个元素的比较策略。* ex:*     int elemCompare(Integer a, Integer b) {*         if (a > b) return InsertionSort.A_GREATER_THAN_B;*         else if (a < b) return InsertionSort.A_LESS_THAN_B;*         else return InsertionSort.A_EQUALS_B;*     }* @param a* @param b* @return a大于b,返回InsertionSort.A_GREATER_THAN_B;a小于b,返回InsertionSort.A_LESS_THAN_B*         a等于b,返回InsertionSort.A_EQUALS_B.*/public abstract int elemCompare(T a, T b);  public static final int NON_DECREASING_SORT = 1;    // 非递减排序public static final int NON_INCREASING_SORT = 2;    // 非递增排序/*** 对elems进行排序,改变其在内存中的值。* 实现算法如下:* INSERTION-SORT(A)*   for j = 2 to A.length*       key = A[j]*   *       i = j - 1*       while i > 0 and A[i] > key*           A[i+1] = A[i]*           i = i - 1*       A[i+1] = key* * @param elems* @param sortType 排序的类型:非递减排序 InsertionSort.NON_DECREASING_SORT;* 非递增排序InsertionSort.NON_INCREASING_SORT*/public void sort(ArrayList<T> elems, int sortType) {if (elems == null){throw new NullPointerException("the elems can not be null");}int expected;switch (sortType) {case NON_DECREASING_SORT:expected = A_GREATER_THAN_B;break;case NON_INCREASING_SORT:expected = A_LESS_THAN_B;break;default :throw new IllegalArgumentException("the sortType's value is illegal");}T temp;for (int j=1,i; j<elems.size(); j++) {temp = elems.get(j);i = j - 1;while (i>=0 && elemCompare(elems.get(i), temp) == expected) {elems.set(i+1, elems.get(i));i = i - 1;}elems.set(i+1, temp);}}
}

转载于:https://www.cnblogs.com/chenshi/p/3889784.html

插入排序之Java实现相关推荐

  1. LeetCode 147. Insertion Sort List 链表插入排序 C++/Java

    LeetCode 147. Insertion Sort List 链表插入排序 C++/Java Sort a linked list using insertion sort. A graphic ...

  2. java 折半插入排序_[Java代码] Java实现直接插入排序和折半插入排序算法示例

    1 排序思想: 将待排序的记录Ri插入到已经排好序的记录R1,R2,--,R(N-1)中. 对于一个随机序列而言,就是从第二个元素开始,依次将这个元素插入到它之前的元素中的相应位置.它之前的元素已经排 ...

  3. 排序算法---插入排序(java版)

    直接插入排序 原理 直接插入排序(Insertion Sort)的原理是:将数组中的数据分为两个区间,已排序区间和未排序区间.初始已排序区间只有一个元素,就是数组的第一个元素.插入算法的核心思想是取未 ...

  4. insertion Sort List (链表的插入排序) leecode java

    逻辑简单,代码难写,基础不劳,leecode写注释不能出现中文,太麻烦,我写了大量注释,链表问题最重要的就是你那个指针式干啥的 提交地址https://oj.leetcode.com/problems ...

  5. 算法笔记_010:插入排序(Java)

    1 问题描述 给定一组数据,使用插入排序得到这组数据的非降序排列. 2 解决方案 2.1 插入排序原理简介 引用自百度百科: 有一个已经有序的数据序列,要求在这个已经排好的数据序列中插入一个数,但要求 ...

  6. 插入排序(java版)

    1 public class InsertSortTest{ 2 public static void InsertSort(int[] source) { 3 //默认第一个元素已排序 4 for ...

  7. java 插入排序_看动画学算法之:排序-插入排序

    简介 插入排序就是将要排序的元素插入到已经排序的数组中,从而形成一个新的排好序的数组. 这个算法就叫做插入排序. 插入排序的例子 同样的,假如我们有一个数组:29,10,14,37,20,25,44, ...

  8. Java常见排序算法之插入排序

    一.概述 本节由小千给大家分享Java常见排序算法之插入排序,之前我们说过排序是算法中的一部分.所以我们学习排序也是算法的入门,为了能让大家感受到排序是算法的一部分,我举个例子证明一下:比如麻将游戏, ...

  9. java八种排序算法---直接插入排序

    在学习算法的过程中,我们难免会接触很多和排序相关的算法.总而言之,对于任何编程人员来说,基本的排序算法是必须要掌握的. 从今天开始,我们将要进行基本的排序算法的讲解.Are you ready?Let ...

最新文章

  1. 设置读取plc时间_最简单的一种方法来step7 读取PLC时间日期
  2. java---switch
  3. 敏捷软件开发读书笔记2
  4. common Lisp学习笔记(十二)
  5. MySQL之表结构设计
  6. [开源] 使用 Python 轻松操作已存在的表
  7. 龙腾世纪:起源(推荐一个可以用来英语学习的RPG游戏)
  8. Android中使用Fragment实现标题栏(不可滑动)
  9. 深度学习图像分类(一):LeNet
  10. Qt 实现Windows系统Win10 c++音量调节
  11. Pandas速查手册中文版
  12. TN3399开发板折腾记录
  13. 苹果账号安全提示问题忘了怎么办?
  14. 【飘儿菜】-Matplotlib-绘制饼图
  15. git中的origin
  16. python小游戏贪吃蛇下载_python实现贪吃蛇小游戏
  17. 中晋最新消息2020年_油价调整最新消息:今天油价再次创出2020年新低
  18. 最全zabbix安装部署
  19. echarts 折线图高于目标显示绿色低于目标显示红色
  20. pytorch 输出中间层特征

热门文章

  1. d-s 多传感器信息融合 matlab实现_自动驾驶中的多传感器融合
  2. matlab和python哪个运行快_matlab vs python: 跑循环的速度对比
  3. 计算机视觉,图像处理 经典代码paper整理(很全很强大!)
  4. 【AI有识境】如何掌握好图像分割算法?值得你看的技术综述
  5. 【AI-1000问】为什么CNN中的卷积核半径都是奇数?
  6. 速卖通物流发货怎么操作?“解读”重点国家市场物流状况
  7. WinForm界面开发之布局控件WeifenLuo.WinFormsUI.Docking的使用
  8. 保持图片和图片框一致的方法 收藏
  9. python excel读取出错_python读取excel数据出错
  10. DIV盒子模型介绍 div用法