选择排序法
为了使用的灵活性,我们使用泛型类型来使得我们的算法适用于任意实现了Comparable接口的数据类型。
其中,大多数情况下,我们的排序代码只会通过两个方法操作数据:less() 方法对元素进行比较,exch()方法将元素交换位置。exch() 方法的实现很简单,通过Comparable接口实现 less() 方法也不难。
选择排序法比较简单,就是每次都找出数组中最小的(或最大的元素)在交换到数组前面,从而使得数组有序,算法复杂度是平方级别。
package com.li.sort;
import java.util.Arrays;
/*选择排序法,使用限制类型的泛型*/
public class Selection {
/*实现Comparable接口的类,有compareTo方法作比较,因为这些类可能没有定义运算符号*/
private static <T extends Comparable<T>> boolean less(T v, T w) {
return v.compareTo(w)<0;
}
/*交换数组的两个索引位置的元素*/
private static <T extends Comparable<T>> void exch(T[] a, int i, int j) {
T t=a[i];
a[i]=a[j];
a[j]=t;
}
public static <T extends Comparable<T>> void show(T[] a) {
//单行打印数组
for(int i=0; i<a.length; i++) {
System.out.print(a[i]+" ");
}
System.out.println();
}
public static <T extends Comparable<T>> boolean isSorted(T[] a) {
for(int i=0; i<a.length-1; i++) {
//运算符对Comparable类型为定义,不能使用
if(less(a[i+1], a[i]))
return false;
}
return true;
}
public static <T extends Comparable<T>> void sort(T[] a) {
int N=a.length;
for(int i=0; i<N; i++) {
int min=i;
for(int j=i+1; j<N; j++)
if(less(a[j], a[min]))
min=j;
exch(a, i, min);
}
}
public static void main(String[] args) {
Integer[] array=new Integer[60];
for(int i=0; i<array.length; i++) {
array[i]=(int)(Math.random()*20);
}
System.out.println(Arrays.toString(array));
QuickThreeWay.sort(array);
System.out.println(Arrays.toString(array));
}
}