选择排序(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());; } } }
================================================