public class Selection {//选择排序
public static void sort(Comparable[] a){ //所有实现Comparable接口的类,都可以使用这排序方法
int N = a.length;//数组a的长度
for(int i = 0; i < N; i++)//遍历一遍,把数组从0角标开始遍历到末尾,每次遍历都拿后一位和目前这一位作比较,所以内循环的初始值是j=i+1
{
int min = i;//默认把0角标的值当做最小值,然后内循环中,遍历i+1角标后面的值,如果有比min角标的值还要小的,就更新min的角标,然后继续j++判断a[j]是否小于a[min]的值,
//值到内循环结束,得出一个最小的值的角标
for(int j = i+1;j<N;j++)
{
if(less(a[j] , a[min]))
min = j;
}
exch(a,i,min);//把拿到最小值的角标和外循环的i交换位置,即把最小值放在最前面的角标,因为每次循环i都++,所以是不会覆盖的,每次交换位置都会在i++角标上
}
}
private static void exch(Comparable[] a, int i, int min) {//自定义交换方法,将 i的值和min的值交换
Comparable temp = a[i];
a[i] = a[min];
a[min] = temp;
}
private static boolean less(Comparable v, Comparable w) {//自定义的比较方法,如果 v小于w,就会返回负数,返回true,那么就可以交换角标了
//为什么要自定义一个less方法,因为传入的comparable参数不可以直接比较,要调用compareTo方法
//比较才是返回boolean值类型,如果直接在sort方法里面用if(a[j] < a[min])是编译不通过的,
//因为返回的不是布尔值类型,if参数是传入布尔值类型的参数
return v.compareTo(w) < 0;
}
public static void main(String[] args) {
Integer[] a = new Integer[]{1000,494,110,12,154,123,456,356,486,576,16,654,23,451,};
sort(a);
for(int num : a){
System.out.print(" "+num);
}
}
}
算法学习来自<算法第四版>书籍
网友评论