首先 先写一个最基础的选择排序:
每次循环从下标为i的位置往后找数组最小值 ,记下最小值下标,内层循环结束交换最小值元素和下标为i的元素的位置,外层循环控制整体交换次数。
public class SelectSore {
public static int[] selectSort(int[] arr) {
int temp = 0;
for (int i = 0; i < arr.length - 1; i++) {
int min = i;
for (int j = i; j < arr.length - 1; j++) {
if (arr[min] > arr[j + 1]) {
min = j + 1;
}
}
temp = arr[i];
arr[i] = arr[min];
arr[min] = temp;
}
return arr;
}
}
添加泛型,为了提高这个类的复用性。继承Comparable接口,调用compareTo方法替代比较运算符,(传进来的对象的类中需要重写compareTo方法!!!)
public class SelectSore<E> {
public static <E extends Comparable<E>> E[] selectSort(E[] arr) {
for (int i = 0; i < arr.length - 1; i++) {
int min = i;
for (int j = i; j < arr.length - 1; j++) {
if (arr[j + 1].compareTo(arr[min]) < 0) {
min = j + 1;
}
}
E temp = arr[i];
arr[i] = arr[min];
arr[min] = temp;
}
return arr;
}
}
写一个Student类测试一下,让他按年龄升序排序,按姓名也行你自己随意
public class Student implements Comparable<Student>{
private String name;
private int age;
public Student(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public int compareTo(Student student) {
return this.age- student.age;
}
@Override
public boolean equals(Object student) {
if(this == student)
return true;
if(student == null)
return false;
if(this.getClass() != student.getClass())
return false;
Student another = (Student)student;
return this.age == another.age;
}
@Override
public String toString() {
return String.format("Student(name: %s, score: %d)", name, age);
}
}
class SelectSortTest {
public static void main(String[] args) {
Student[] arr ={new Student("张三",30),new Student("李四",18),new Student("王五",25)};
SelectSort.selectSort(arr);
System.out.println(Arrays.toString(arr));
}
}
Student对象按年龄升序排序结果:
你学废了吗?哈哈
欢迎斧正