排序算法:选择排序算法:选择最小的放在有序的开始位置 arr[i,n) 未排序,arr[0,i) 已排序

    1. 先把最小的拿出来,放到i=0,i++
    2. 剩下的,再把最小的拿出来,放大i的位置,i++ … 每次选择还没处理的元素里最小的元素

    实现方式如下:

    1. /**
    2. * 排序算法:选择排序算法:选择最小的放在有序的开始位置 arr[i,n) 未排序,arr[0,i) 已排序
    3. * 1. 先把最小的拿出来,放到i=0,i++
    4. * 2. 剩下的,再把最小的拿出来,放大i的位置,i++
    5. * ....
    6. * 每次选择还没处理的元素里最小的元素
    7. */
    8. public class SelectSort {
    9. private SelectSort() {
    10. }
    11. public static <E extends Comparable<E>> void sort(E[] arr) {
    12. for (int i = 0; i < arr.length; i++) {
    13. //选择arr[i,n) 中的最小值索引,其中arr[0,i)是有序的
    14. int minIndex = i;
    15. for (int j = i; j < arr.length; j++) {
    16. //compareTo 相当于arr[j]-arr[minIndex] < 0
    17. if (arr[j].compareTo(arr[minIndex]) < 0) {
    18. minIndex = j;
    19. }
    20. }
    21. //交换位置 arr[i] 和 arr[minIndex] minIndex 一定是大于i的如果 等于就没必要交换
    22. if (minIndex > i) {
    23. swap(arr, i, minIndex);
    24. }
    25. }
    26. }
    27. private static <E extends Comparable<E>> void swap(E[] arr, int i, int minIndex) {
    28. E temp = arr[i];
    29. arr[i] = arr[minIndex];
    30. arr[minIndex] = temp;
    31. }
    32. public static void main(String[] args) {
    33. // 【6 4 2 3 1 5】 需要新开辟一个数组,占用了额外的空间。优化:可否实现原地排序?
    34. // 索引i 和 j, j 开始查找最小值
    35. // arr[i,n) 中最小值放到arr[i]的位置 i++
    36. Integer[] arr = {6, 4, 3, 1, 2, 5};
    37. sort(arr);
    38. for (Integer integer : arr) {
    39. System.out.println("arr = " + integer);
    40. }
    41. Student[] stus = {new Student("张三", 6), new Student("张三2", 1),
    42. new Student("张三3", 2), new Student("张三5", 3),
    43. new Student("张三4", 4),new Student("张三6", 5)};
    44. sort(stus);
    45. for (Student student : stus) {
    46. System.out.println("stu = " + student);
    47. }
    48. }
    49. }