Demo05.java 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546
  1. import java.util.Arrays;
  2. /**
  3. * @author WanJl
  4. * @version 1.0
  5. * @title Demo05
  6. * @description 数组排序-选择排序
  7. * @create 2026/7/16
  8. */
  9. public class Demo05 {
  10. /*
  11. 选择排序:
  12. 选择排序的思路要比冒泡排序更聪明一点,冒泡排序是不断的交换相邻的元素,而选择排序,是每轮只做一次交换。
  13. 选择的思路是 每一轮从剩余未排序的元素中找出最小的元素,直接把它放到未排序部分的第1位。
  14. 核心思路:每一轮从未排序区间选出最小值,与未排序区间的第1个元素进行交换。
  15. 优点:交换次数比冒泡更少
  16. 缺点:不稳定,可能会破坏相对顺序
  17. */
  18. public static void main(String[] args) {
  19. /*
  20. 选择排序:每一轮从未排序区间选出最小值,放到已排序区间的末尾
  21. */
  22. int[] arr={1,456,782,5,8,4,598,1,46,68,465,74};
  23. //外层循环:i 既是已排序区间的末尾边界,也是当前要确定的位置
  24. for (int i = 0; i < arr.length-1; i++) {
  25. //假设当前未排序区间的第1个元素就是最小的
  26. int minIndex=i; //假设i就是最小的元素的索引值
  27. //内层循环:在未排序区间[i+1,arr.length-1] 找到真正的最小值
  28. for (int j = i+1; j <arr.length; j++) {
  29. //判断谁才是最小值
  30. if (arr[j]<arr[minIndex]){
  31. minIndex=j; //就更新最小元素的索引值
  32. }
  33. } //当内层循环跑完一轮,就得到了数组的最小元素索引值
  34. // 如果得到的最小元素索引值 minIndex 和 当前的 i 不想等,
  35. //那就交换位置
  36. if (minIndex!=i){
  37. arr[minIndex]=arr[minIndex]+arr[i];
  38. arr[i]=arr[minIndex]-arr[i];
  39. arr[minIndex]=arr[minIndex]-arr[i];
  40. }
  41. System.out.println("第"+(i+1)+"轮选择后:"+ Arrays.toString(arr));
  42. }
  43. }
  44. }