找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 153|回复: 0

选择排序

[复制链接]

373

主题

55

回帖

1944

积分

管理员

积分
1944
发表于 2021-7-2 09:20:19 | 显示全部楼层 |阅读模式
选择排序的本质在于每次循环确定一个最大/最小值
默认以第一位作为最大最小值索引(为什么不直接记录值,而是记录索引,因为数组位置需要做交换)
内层循环对剩余数组元素进行循环判断,更新最大/最小值数组对应的索引


因此选择排序两个循环,外层循环整个数组,内层循环从选择元素的下一个开始做比较,确定选择元素对应的数值
for(int i = 0; i< arr.length; i++){
     int minIndex = arr;
      for(int j = i+1; j< arr.length; j++){
           if(arr[j].compareTo(arr[minIndex] < 0)){
                    // 确认最小值,目标元素比默认元素还小,应当选择做交换
                    minIndex = j;
           }
      }
     //  内层循环完毕后就已经确认了i元素应该与哪个最大/最小 元素作交换,直接
     swap(arr, i, minIndex);
}




  1. public static <E extends Comparable> void sort(E[] arr){
  2.         // 选择排序,每次把最大、最小放在前面
  3.         for(int i = 0; i<arr.length; i++){

  4.             int minIndex = i;
  5.             for(int j = i + 1; j<arr.length; j++){
  6.                 if(arr[j].compareTo(arr[minIndex]) < 0){
  7.                     minIndex = j;
  8.                 }
  9.             }

  10.             swap(arr, minIndex, i);
  11.         }
  12.     }

  13.     public static void main(String[] args) {
  14.         Integer[] arr = {9,1,3,5,7,2,4,12,9};
  15.         sort(arr);

  16.         Stream.of(arr).forEach(System.out::println);
  17.     }

  18.     private static <E extends Comparable> void swap(E[] arr, int minIndex, int i) {
  19.         E temp = arr[minIndex];
  20.         arr[minIndex] = arr[i];
  21.         arr[i] = temp;
  22.     }
复制代码


A.compareTo(B) , 返回的结果如果A 大于B 返回1, 如果相等返回0, 如果小于返回-1
那么同理可得,在实现Comparable 接口的时候,覆写CompareTo方法也按照这个思路去写,跟入参比较,直接用当前属性值去减入参属性值即可
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|Comsenz Inc.

GMT+8, 2024-9-20 07:49 , Processed in 0.045323 second(s), 18 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表