主要是区分内层循环和外层循环做的事情,内层循环做比较,外层循环做比较的次数

    1. public static void main(String[] args) {
    2. int[] arr = {1, 3, 5, 7, 8, 3, 4, 6, 0};
    3. System.out.println(Arrays.toString(bubbleSort(arr)));
    4. }
    5. public static int[] bubbleSort(int[] arr) {
    6. if (arr != null && arr.length > 0) {
    7. /**
    8. * -1 的原因
    9. * i = 0 内层循环的 执行过程
    10. * 13 35 57 78
    11. * 83 exchange(8,3) 1, 3, 5, 7,3,8,4,6,0
    12. * 84 exchange(8,4) 1, 3, 5, 7,3,4,8,6,0
    13. * 86 exchange(8,6) 1, 3, 5, 7,3,4,6,8,0
    14. * 80 exchange(8,0) 1, 3, 5, 7,3,4,6,0,8
    15. * @result : {1,3,5,7,3,4,6,0,8}
    16. * i = 1 内层循环的 执行过程
    17. * 13 35 57 73
    18. * 73 exchange(7,3) 1,3,5,3,7,4,6,0,8
    19. * 74 exchange(7,4) 1,3,5,3,4,7,6,0,8
    20. * 76 exchange(7,6) 1,3,5,3,4,6,7,0,8
    21. * 70 exchange(7,0) 1,3,5,3,4,6,0,7,8
    22. * 78
    23. * @result : { 1,3,5,3,4,6,0,7,8}
    24. * .....
    25. * i = arr.length -2
    26. *
    27. * i = arr.length -1
    28. *
    29. * 之间的区别
    30. * 当i = arr.length - 2 时 内层循环
    31. * j = 0 ; j < 2 ;j++
    32. * - j = 0 arr[0] arr[1]比较
    33. * - j = 1 arr[1] arr[2] 比较
    34. * 当 i = arr.length -1 是 内层循环
    35. * j = 0 ; j < 0 ; j++
    36. *
    37. *
    38. */
    39. for (int i = 0; i < arr.length - 1; i++) {
    40. for (int j = 0; j < arr.length - 1 - i; j++) {
    41. if (arr[j] < arr[j + 1]) {
    42. arr[j] = arr[j + 1] + arr[j];
    43. arr[j + 1] = arr[j] - arr[j + 1];
    44. arr[j] = arr[j] - arr[j + 1];
    45. }
    46. }
    47. }
    48. }
    49. return arr == null ? new int[]{} : arr;
    50. }
    51. // 运行结果 :[8, 7, 6, 5, 4, 3, 3, 1, 0]