1,对元素进行排列时,元素之间需要进行比较,因此需要实现Comparable<T>接口。即,<T extends Comparable<T>>. 更进一步,如果允许待比较的类型可以和它的父类型进行比较,则需要写成:<T extends Comparable<? super T>, 其中<? super T> 表示 T 的任意超类。

2,InsertionSortArray.java 类实现了从小到大顺序以插入排序的方式对数据进行排序。

3,insertionSort方法负责对每一个元素进行排序,insertInOrder方法将待排序的元素插入到合适的位置,相当于执行具体的操作。

具体代码如下:

public class InsertionSortArray {
public static <T extends Comparable<? super T>> void insertSort(T[] a, int n){
insertionSort(a, 0, n - 1);//对序列a进行排序,其起始索引为0,最后元素的索引为n-1
} //从索引first到last执行插入排序
private static <T extends Comparable<? super T>> void insertionSort(T[] a, int first, int last){
for(int unsorted = first + 1; unsorted <= last; unsorted++){//插入排序中第一个元素视为有序,故从第二个元素开始
T firstUnsorted = a[unsorted];//获得待排序的元素
insertInOrder(firstUnsorted, a, first, unsorted - 1);//将之插入到合适的位置
}
} //将element插入到已经排好序的,起始位置为begin,终止位置为end的 序列中
private static <T extends Comparable<? super T>> void insertInOrder(T element, T[] a, int begin, int end){
int index = end;
//待插入的元素依次从后往前与已排序好的元素进行比较,直至找到比它小的元素为止
while((index >= begin) && (element.compareTo(a[index]) < 0)){
a[index + 1] = a[index];//将元素后移一位,a[index+1]其实就是element
index--;
}
a[index + 1] = element;//将element插入到合适的位置
}
}

4,在实现排序时,我们使用了泛型。使用泛型的好处是:对于任何类型的对象,只要它实现了Comparable接口,就可以通过调用compareTo方法对之进行比较。

因此,它还可以对自定义类型的对象进行排序,只要你定义的类实现Comparable接口就可以了。

以下测试类中定义了String类型数组和Integer类型的数组,并都可以调用插入排序的方法进行排序,代码如下:

public class TestSort {
public static void main(String[] args) {
String[] arr = {"hello","world","hadoop","hbase","hive"};
InsertionSortArray.insertSort(arr, arr.length);
System.out.println("字符串排序结果");
for(String str : arr)
System.out.println(str);
Integer[] integer = {1,5,3,8,10,4};
InsertionSortArray.insertSort(integer, integer.length);
System.out.println("整数排序结果");
for(int i : integer)
System.out.println(i);
}
}

插入排序算法的JAVA实现的更多相关文章

  1. 插入排序算法(Java代码实现)

    其它经典排序算法:https://blog.csdn.net/weixin_43304253/article/details/121209905 插入排序算法: 思路:将数据分为已经排序好的数据和未排 ...

  2. 直接插入排序算法(java)

    直接插入排序是将未排序的数据插入至已排好序序列的合适位置. 具体流程如下: 1.首先比较数组的前两个数据,并排序: 2.比较第三个元素与前两个排好序的数据,并将第三个元素放入适当的位置: 3.比较第四 ...

  3. 排序系列 之 折半插入排序算法 —— Java实现

    基本思想: 折半插入算法是对直接插入排序算法的改进,排序原理同直接插入算法: 把n个待排序的元素看成一个有序表和一个无序表,开始时有序表中只有一个元素,无序表中有n-1个元素:排序过程即每次从无序表中 ...

  4. 排序系列 之 直接插入排序算法 —— Java实现

    直接插入排序算法 基本思想: 把n个待排序的元素看成一个有序表和一个无序表,开始时有序表中只有一个元素,无序表中有n-1个元素:排序过程即每次从无序表中取出第一个元素,将它插入到有序表中,使之成为新的 ...

  5. 【java集合框架源码剖析系列】java源码剖析之java集合中的折半插入排序算法

    注:关于排序算法,博主写过[数据结构排序算法系列]数据结构八大排序算法,基本上把所有的排序算法都详细的讲解过,而之所以单独将java集合中的排序算法拿出来讲解,是因为在阿里巴巴内推面试的时候面试官问过 ...

  6. Java插入排序算法

    直接插入排序算法 基本思想: 把n个待排序的元素看成一个有序表和一个无序表,开始时有序表中只有一个元素,无序表中有n-1个元素:排序过程即每次从无序表中取出第一个元素,将它插入到有序表中,使之成为新的 ...

  7. 几种常见排序算法之Java实现(插入排序、希尔排序、冒泡排序、快速排序、选择排序、归并排序)

    排序(Sorting) 是计算机程序设计中的一种重要操作,它的功能是将一个数据元素(或记录)的任意序列,重新排列成一个关键字有序的序列. 稳定度(稳定性)一个排序算法是稳定的,就是当有两个相等记录的关 ...

  8. 插入排序算法 Java实现

    插入排序算法是算法排序中的一种: 该算法是假设已有序列是有序序列,从首元素(首元素为单个元素,肯定是有序的...)开始分析,对其他元素的位置进行有序的确定: 以算法为例: public class I ...

  9. 用 Java 实现一个插入排序算法

    有一个已经有序的数据序列,要求在这个已经排好的数据序列中插入一个数,但要求插入后此数据序列仍然有序,这个时候就要用到一种新的排序方法:插入排序法.插入排序的基本操作就是将一个数据插入到已经排好序的有序 ...

随机推荐

  1. 面象对象设计原则之四:接口隔离原则(The Interface Segregation Principle,ISP)

    接口隔离原则定义如下: 接口隔离原则(Interface  Segregation Principle, ISP):使用多个专门的接口,而不使用单一的总接口,即客户端不应该依赖那些它不需要的接口. 根 ...

  2. Docker(十四)-Docker四种网络模式

    Docker 安装时会自动在 host 上创建三个网络,我们可用 docker network ls 命令查看: none模式,使用--net=none指定,该模式关闭了容器的网络功能. host模式 ...

  3. Jquery 组 tbale表格筛选

    <!DOCTYPE html><html lang="zh-cn"><head> <meta charset="utf-8&qu ...

  4. maven项目使用本地jar包

    问题描述 今天自己写demo需要用到jodconverter-2.2.2.jar,但是maven库中只有2.2.1的版本.我看网上有提供jar包的.于是我下载下来,但是怎么引用到pom文件中呢?并且保 ...

  5. 研究VCL源码的原因和起点

    ---恢复内容开始--- 研究VCL源码的原因和起点 根本原因:当然是希望自己成为Delphi高手,因为这么多年过去,觉得自己始终不得要领,修改一个控件都无从下手,一直都只是个会拖控件的白痴.而我却拥 ...

  6. 学习笔记之csrf

    CBV 添加 csrf 第一种: 指定方法方面添加 装饰器 @memethod_decorator(xxx) 第二种 全部添加: 注意 在类名前: @method_decorator(xxx,name ...

  7. asp.net 后台<%@ Page%> page指令属性

    aspx文件有如下一行代码: <%@ Page Language="C#" AutoEventWireup="true" CodeBehind=" ...

  8. BZOJ3786星系探索——非旋转treap(平衡树动态维护dfs序)

    题目描述 物理学家小C的研究正遇到某个瓶颈. 他正在研究的是一个星系,这个星系中有n个星球,其中有一个主星球(方便起见我们默认其为1号星球),其余的所有星球均有且仅有一个依赖星球.主星球没有依赖星球. ...

  9. 【Linux】Centos6.8下一键安装Lamp环境

    [下载地址] 以下三种都是快捷安装环境的工具,都提供相应的脚本,原理都相同,一个会了其他的也就都会了,我用的比较多的会是lnmp和oneinstack,最近在用的都是oneinstack,挺好用的. ...

  10. 洛谷P4072 [SDOI2016]征途(带权二分,斜率优化)

    洛谷题目传送门 一开始肯定要把题目要求的式子给写出来 我们知道方差的公式\(s^2=\frac{\sum\limits_{i=1}^{m}(x_i-\overline x)^2}{m}\) 题目要乘\ ...