Java排序--选择排序

在排序中我们这里使用的是继承自Comparable接口的数据,因为一般写方法的时候都是为了解决某一类的问题,而不是特指某一个问题。至于基本类型,封装类已经实现了Comparable接口,可以对照java的api来使用。

过程:

选择排序是一种简单的排序:首先找到数组中最小的元素,将它和第一个元素交换(如果第一个元素是最小元素,就和自己交换)。再次从剩下的元素中找到最小的元素,与第二个位置交换,如此往复,直到将整个数组排序,这种方法交选择排序。

特点

运行时间和输入无关:为了找到数组中的最小的元素会遍历一次数组,但是第一次的遍历并不会给第二次的循环提供什么帮助,这种性质某些情况下是个缺点。已经排序好的数组或者在一个键相同的数组中,他们的时间会和一个乱序的数组的时间是一样的。 数据移动是最少的:每次交换都会改变两个数的值,因此选择排序用了N(数组的长度)次交换–交换的次数和数组的大小呈线性关系。

代码实现

public static boolean less(Comparable a, Comparable b) {
    return a.compareTo(b)<0;

}

上面方法实现的是比较,把两个继承自Comparable的类进行比较。compareTo是Comparable的唯一方法,用来比较两个继承自Comparable的类的方法,返回类型为整型数据。如果为-1,表示a值小于b值。如果等于,表示两个值相等。如果为1,表示a值大于b值。



public  static  void exch(Comparable []a,int i,int j){
    Comparable t=a[i];
    a[i]=a[j];
    a[j]=t;
}

上面方法是交换,把数组的值进行交换。

选择排序的代码块

public static void sort(Comparable[] a){
    //设置N为数组长度
    int N=a.length;
    //1
    for (int i=0;i<N;i++){
        //2
        int min=i;
        //3
        for (int j=i+1;j<N;j++){
            //4
            if(less(a[j],a[min])){
                //5
                min=j;
            }
            //6
            exch(a,i,min);

        }
    }

}

上面代码是选择排序的代码,
1: 表示循环的次数,也就是经历多少次循环才能把数组完全排序完成,注意的是即时你第一次循环就已经把数组顺序排列整齐,第二次还是会进入的,这个是选择排序的特点之一,当然这个次数是最乱的情况下。
2: 表示进入循环之后把第一个坐标的值,当成最小的值,赋值给定义的标记,用来下面代码进行比较。
3: 循环,表示循环数组中的每一项数据进行比较,这个循环和1 不同。1表示总的循环次数,该循环表示循环真个数组。定义j=i+1是因为选择排序都是向后比较的,如果是0进来,那么表示a[0]和a[1]比较。1循环第二次进入的时候,表示第一个最小值已经排序完成,所以不需要在从0位置开始排序了。这样避免从头开始,减少了步骤。
4&5: 判断参数1的值是否小于参数2,如果小于参数2执行5把小的值复制给我们定义的最小标记。
6: 把数值交换,把最小值交换到最前面。

对于长度为N的数组,选择排序需要大约N*N/2次比较和N次交换。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值