优点:原地完成,不需要开辟额外的空间。
思路:
使用一个索引i表示数组开头的部分,索引i从0开始,设置一个索引j找数组中最小的元素,找到后与索引i的位置交换,此时i的位置为最小的元素,此时使用i++排序下一个元素。相当于在每一步的排序中arr[i...n)未排序,arr[0...i)进行了排序。
代码:
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; j<arr.length; j++){
if (arr[j]<arr[minIndex]){
minIndex = j;
}
}
swap(arr, i ,minIndex);
}
}
private static void swap(int[] arr , int i ,int j){
int t = arr[i];
arr[i] = arr[j];
arr[j] = t;
}
public static void main(String[] args) {
int[] arr = {1,4,2,3,6,5};
SelectionSort.sort(students);
for (int arr : e){
System.out.print(e + " ");
}
System.out.println();
}
}
扩展:使用带约束的泛型的方法实现选择排序
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; j<arr.length; j++){
if (arr[j].compareTo(arr[minIndex])<0){
minIndex = j;
}
}
swap(arr, i ,minIndex);
}
}
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(students);
for (int arr : e){
System.out.print(e + " ");
}
System.out.println();
}
}
在java语言中,泛型要求传入的必须是一个类,因此在这要使用int的包装类Integer。
使用自定义的类来测试选择排序算法。
定义一个student测试类
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 int compareTo(Student another){
return this.score - another.score;
}
@Override
public String toString(){
return String.format("Student(name: %s, score: %d)",name,score);
}
}
public static void main(String[] args) {
Student[] students = {new Student("Alice",98),
new Student("Bolo",100),
new Student("Charles",66)};
SelectionSort.sort(students);
for (Student student : students){
System.out.print(student + " ");
}
System.out.println();
}
|