美文网首页
p156算法2.1选择排序

p156算法2.1选择排序

作者: FiveZM | 来源:发表于2018-01-25 12:30 被阅读0次

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

}

}
算法学习来自<算法第四版>书籍

相关文章

网友评论

      本文标题:p156算法2.1选择排序

      本文链接:https://www.haomeiwen.com/subject/wfcvaxtx.html