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);
}
}