Demo04.java 2.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. import java.util.Arrays;
  2. /**
  3. * @author WanJl
  4. * @version 1.0
  5. * @title Demo04
  6. * @description 数组排序-冒泡排序
  7. * @create 2026/7/16
  8. */
  9. public class Demo04 {
  10. /*
  11. 我们现在已经学了最基础的 数据结构与算法
  12. 数据结构:数组结构--属于线性结构的一种
  13. 算法:比如排序算法(冒泡、选择、插入...)
  14. 冒泡排序,是所有排序【算法】最直观的,最基础的一种。
  15. 冒泡排序就像水里的泡泡一样,大的元素会逐渐的冒到数组的末端。
  16. 冒泡排序的核心思想:
  17. 重复遍历数组,依次比较相邻的两个元素,如果顺序错误(假如是从小到大排序,但a比b大)就交换。
  18. 每轮遍历把当前未排序的部分的最大值“冒泡”到正确位置。
  19. */
  20. public static void main(String[] args) {
  21. /*
  22. 冒泡排序的基础版
  23. 每一轮把未排序部分的最大值“冒泡”到数组末尾
  24. */
  25. int[] arr={1,456,782,5,8,4,598,1,46,68,465,74};
  26. //冒泡排序需要两层循环
  27. for (int i = 0; i <arr.length-1; i++) { //外层循环,控制的一共冒泡多少轮
  28. //内层循环 在未排序的区间[0,arr.length-1-i] 中相邻比较
  29. //因为 i 后面的元素已经有序了,不需要再比较了
  30. for (int j = 0; j < arr.length-1-i; j++) {
  31. if (arr[j]>arr[j+1]){
  32. //交换位置
  33. arr[j]=arr[j]+arr[j+1];
  34. arr[j+1]=arr[j]-arr[j+1];
  35. arr[j]=arr[j]-arr[j+1];
  36. }
  37. }
  38. }
  39. System.out.println(Arrays.toString(arr));
  40. // 优化版
  41. int[] arr2={1,456,782,5,8,4,598,1,46,68,465,74};
  42. //冒泡排序需要两层循环
  43. for (int i = 0; i <arr2.length-1; i++) { //外层循环,控制的一共冒泡多少轮
  44. boolean b=false; //定义boolean类型的变量,用来标记本轮是否有交换
  45. //内层循环 在未排序的区间[0,arr.length-1-i] 中相邻比较
  46. //因为 i 后面的元素已经有序了,不需要再比较了
  47. for (int j = 0; j < arr2.length-1-i; j++) {
  48. if (arr2[j]>arr2[j+1]){
  49. //交换位置
  50. arr2[j]=arr2[j]+arr2[j+1];
  51. arr2[j+1]=arr2[j]-arr2[j+1];
  52. arr2[j]=arr2[j]-arr2[j+1];
  53. b=true; //本轮有交换
  54. }
  55. }
  56. //判断,如果本轮没有发生任何交换,说明数组已经有序,提前结束
  57. if (b==false){
  58. break;
  59. }
  60. System.out.println("第"+(i+1)+"轮冒泡后:"+Arrays.toString(arr2));
  61. }
  62. }
  63. }