选择排序
package com.example.main;
import com.example.bean.Student;
public class SelectionSort {
private SelectionSort() {}
public static <E extends Comparable<E>> void sort(E[] arr){
//arr[0...i)是有序的;arr[i...n)是无序的
for(int i=0;i<(arr.length-1);i++){
//选择arr[i...n)中的最小值的索引
int minIndex = i;
for(int j=i; j<arr.length;j++){
if(arr[j].compareTo(arr[minIndex])<0){
minIndex = j;
}
}
swap(arr,i,minIndex);
}
}
arr[i...n)是有序的;arr[0...i)是无序的;
public static <E extends Comparable<E>> void reverseSort(E[] arr){
for(int i=(arr.length-1);i>0;i--){
//选择arr[0...i)中的最大值索引
int maxIndex = i;
for(int j=i-1;j>=0;j--){
if(arr[j].compareTo(arr[maxIndex])>0){
maxIndex = j;
}
}
swap(arr,i,maxIndex);
}
}
private static<E> void swap(E[] arr,int i, int j){
E t = arr[i];
arr[i] = arr[j];
arr[j] = t;
}
public static void main(String[] args) {
Integer[] arr = {1,4,2,3,6,5};
SelectionSort.sort(arr);
for(int e:arr){
System.out.print(e+" ");
}
System.out.println();
SelectionSort.reverseSort(arr);
for(int e:arr){
System.out.print(e+" ");
}
System.out.println();
Student[] students = {new Student("Alice",98),
new Student("Bobo",100),
new Student("Charles",66)
};
SelectionSort.sort(students);
for(Student student : students){
System.out.print(student+" ");
}
System.out.println();
SelectionSort.reverseSort(students);
for(Student student : students){
System.out.print(student+" ");
}
System.out.println();
}
}
package com.example.bean;
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(null == student)
return false;
if(this.getClass() != student.getClass()){
return false;
}
Student another = (Student)student;
return this.name.equals(another.name);
}
@Override
public int compareTo(Student another) {
// if(this.score < another.score){
// return -1;
// }
// else if(this.score == another.score){
// return 0;
// }
// else{
// return 1;
// }
// return this.score - another.score;
return this.score - another.score;
}
@Override
public String toString() {
return String.format("Student(name: %s,score: %d)",name,score);
}
}
package com.example.test;
import com.example.main.SelectionSort;
public class SortingHelper
{
private SortingHelper(){}
public static <E extends Comparable<E>> boolean isSorted(E[] arr){
for(int i=1;i< arr.length;i++){
if(arr[i-1].compareTo(arr[i])>0){
return false;
}
}
return true;
}
public static <E extends Comparable<E>> void sortTest(String sortname,E[] arr){
long startTime = System.nanoTime();
if(sortname.equals("SelectionSort")){
SelectionSort.sort(arr);
}
long endTime = System.nanoTime();
double time = (endTime - startTime) / 1000000000.0;
if(!SortingHelper.isSorted(arr))
throw new RuntimeException("SelectionSort failed");
System.out.println(String.format("%s , n = %d : %f s",sortname,arr.length,time));
}
}