排序算法之选择排序

选择排序(Selection sort)是一种简单直观的排序算法。它的工作原理是:第一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,然后再从剩余的未排序元素中寻找到最小(大)元素,然后放到已排序的序列的末尾。以此类推。

方法:在原有数组上进行排序,使用双重循环:

1.基础方法:

================================================

public class SelectionSort {

    private SelectionSort(){}

    public static void sort(int[] arr){


           for(int i=0;i<arr.length;i++){
                   int minIndex=i;
                   for (int j=i+1;j<arr.length;j++){
                           if (arr[minIndex]>arr[j]){
                                 minIndex=j;
                           }
                   }
                   swap(arr,minIndex,i);
           }

    }
    private static void swap(int[] arr,int minIndex,int j){
        int temp=arr[minIndex];
        arr[minIndex]=arr[j];
        arr[j]=temp;
    }


    public static void main(String[] args) {
          int[] arr={6,3,9,7,8,2,33,10};
          SelectionSort.sort(arr);
          for (int e: arr){
              System.out.print(e+" ");

          }
    }

}

================================================

在这段代码中仅能使int类型的数组进行排序,后面使用带有约束的泛型。

注意:sort方法是static类型的,所以在其内部调用的也应是 static类型,所以swap也是static类型的,尽管他是private。

 

2.进阶1版:

在这个版本中使用了泛型,并且泛型必须是可比较的,因为swap的一个参数是数组,所以swap也必须是泛型,但是没有约束,

因为swap的参数数组已经被约束,并且swap仅仅是交换位置,也不必是可约束的。

这个版本没有使用自定义类,在下一个版本中会使用。

================================================

public class SelectionSort {

    private SelectionSort(){}

    public static <E extends Comparable<E>>void sort(E[] arr){


           for(int i=0;i<arr.length;i++){
                   int minIndex=i;
                   for (int j=i+1;j<arr.length;j++){
                           if ((arr[minIndex].compareTo(arr[j])>0) ){
                                 minIndex=j;
                           }
                   }
                   swap(arr,minIndex,i);
           }

    }
    private static <E> void swap(E[] arr,int minIndex,int j){
        E temp=arr[minIndex];
        arr[minIndex]=arr[j];
        arr[j]=temp;
    }


    public static void main(String[] args) {
          Integer[] arr={6,3,9,7,8,2,33,10};
          SelectionSort.sort(arr);
          for (int e: arr){
              System.out.print(e+" ");

          }
    }

}

================================================

3.进阶2版:

使用自定义类student来进行选择排序。

首先来看一下student类:

 

注意:这里实现了Comparable接口,就必须重写compareTo()函数

================================================

public class Student implements Comparable<Student> {

    //只设置一个属性
    private String name;
    private int score;
    public Student(String name,int score){
        this.name=name;
        this.score=score;
    }

    @Override
    public boolean equals(Object student){

        if (this==student){
            return true;
        }
        if (student==null){
            return false;
        }
        if (this.getClass()!=student.getClass()){
            return false;
        }

        //直接将 Object类转成Student类可能出现异常,所以有了上面三个if语句
        Student another=(Student) student;
        return  this.name.equals(another.name);
    }

    @Override
    public int compareTo(Student another) {
        return this.score-another.score;
    }

    @Override
    public String toString(){
        return String.format("学生(姓名: %s,成绩: %d)",this.name,this.score);
    }
}

 

================================================

public class SelectionSort {

    private SelectionSort(){}

    public static <E extends Comparable<E>>void sort(E[] arr){


           for(int i=0;i<arr.length;i++){
                   int minIndex=i;
                   for (int j=i+1;j<arr.length;j++){
                           if ((arr[minIndex].compareTo(arr[j])>0) ){
                                 minIndex=j;
                           }
                   }
                   swap(arr,minIndex,i);
           }

    }
    private static <E> void swap(E[] arr,int minIndex,int j){
        E temp=arr[minIndex];
        arr[minIndex]=arr[j];
        arr[j]=temp;
    }


    public static void main(String[] args) {

          Student[] students={
                  new Student("刘朋",100),
                  new Student("李腾辉",60),
                  new Student("气虚阳",80),
                  new Student("赵重阳",50),
                  new Student("趋势好",66),
                  new Student("翟炳森",99),
          };
          SelectionSort.sort(students);
        for (Student e: students){
            System.out.println(e.toString());;
        }
    }

}

 

 

================================================

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值