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. Linux 下如何知道是否有人在使坏?

    在 Linux 下查看用户的行为,不仅仅是网管要做的事,也是开发人员所应该具备的基本技能之一.为什么呢?因为有时其他同事在做一些很消耗资源的事情,比如在编译大型程序,可能会导致服务器变得很慢,从而影响 ...

  2. [转帖] linux下面 vim 数字键无法插入的解决办法

    感谢原作者: https://blog.csdn.net/guoyuqi0554/article/details/11477597 这个问题困扰自己好久了.. 刚才解决了 rlwrap的问题 这会儿 ...

  3. Oracle重新获取统计信息以及SQLSERVER重建索引

    Oracle重新获取统计信息 exec dbms_stats.gather_schema_stats(ownname =>'LCoe739999',options => 'GATHER', ...

  4. WorkStation 虚拟机迁移到 ESXi的后续处理.

    自己遇到了然后按照blog http://blog.sina.com.cn/s/blog_79a8b8e10102w8bm.html 解决 特此记录一下. 将Workstation的vmdk文件导入到 ...

  5. centos 7 修改系统屏幕分辨率

    centos 7 修改系统屏幕分辨率,命令方式和图形方式的修改方法. 命令:xrandr 通过命令 xrandr 修改系统的分辨率,输入xrandr: bash [admin@localhost ~] ...

  6. python使用原始套接字 解析原始ip头数据

    使用底层套接字解码底层流量,是这次做的重点工作. 首先来捕获第一个包 # coding:utf-8import socket # 监听的主机IP host = "192.168.1.100& ...

  7. 经典Java面试题收集(二)

    经典的Java面试题(第二部分),这部分主要是与Java Web和Web Service相关的面试题. 96.阐述Servlet和CGI的区别? 答:Servlet与CGI的区别在于Servlet处于 ...

  8. bzoj 2202 [HNOI2010] Bounce 弹飞绵羊(分块)

    链接:https://www.lydsy.com/JudgeOnline/problem.php?id=2002 思路:和之前那道树分块的题很像,只不过那道是在树上,这道简单些在序列上 还是维护两个数 ...

  9. MT【216】韦达定理

    设$n$为正整数,$a_1,a_2,\cdots,a_n;b_1,b_2,\cdots,b_n;A,B$都是正数, 满足$a_i\le b_i,a_i\le A,i=1,2,\cdots,n$ 且$\ ...

  10. 用DotNetOpenAuth实现基于OAuth 2.0的web api授权 (一)Getting Start

    1. 下载 源码下载 2. build solution,创建虚拟目录: 右健MyContatacts/MyPromo项目,选择Properties,点击左边的Web,点击 Create Virtua ...