关于Java语言中的数组排序--冒泡排序与选择排序的详解,和冒泡排序与选择排序的比较

一、冒泡排序的详解
  1、每一次循环结束后,都要找出最大的数据,放到参与比较的这堆数据的最右边。(冒出最大的气泡)
   2、核心:拿着左 边的数字和右边的数字比对,当左边 > 右边的时候,交换位置
  3、举例说明:int[] arr = {1,4,6,3,9,5,0};
    第一次循环,参与比较的数据:1,4,6,3,9,5,0
      第一次排序:1,4,6,3,9,5,0
      (1和4比较,1小于4,不交换位置)
      第二次排序:1,4,6,3,9,5,0
      (4和6比较,4小于6,不交换位置)
      第三次排序:1,4,3,6,9,5,0
      (6和3比较,6大于3,交换位置)
      第四次排序:1,4,3,6,9,5,0
      (6和9比较,6小于9,不交换位置)
      第五次排序:1,4,6,3,5,9,0
      (9和5比较,9大于5,交换位置)
      第六次排序:1,4,6,3,5,0,9
      (9和0比较,9大于0,交换位置)
最终冒出的最大数据在最右边:9
-----------------------------------------------------------------------------------
    第二次循环,参与比较的数据:1,4,6,3,5,0
      第一次排序:1,4,6,3,5,0
      (1和4比较,1小于4,不交换位置)
      第二次排序:1,4,6,3,5,0
      (4和6比较,4小于6,不交换位置)
      第三次排序:1,4,3,6,5,0
      (3和6比较,6大于3,交换位置)
      第三次排序:1,4,3,5,6,0
      (6和5比较,6大于5,交换位置)
      第三次排序:1,4,3,5,0,6
      (6和0比较,6大于0,交换位置)
最终冒出的最大数据在最右边:0
之后依次类推


二、选择排序的详解
   1、每一次从这堆参与比较的数组当中找出最小值,
        拿着这个最小值和最前面的元素交换位置。
   2、选择排序比冒泡排序好在:每一次交换位置都是有意义的
   3、举例说明:int[] arr = {1,4,6,3,9,5,0};
   第一次比较:
    参与比较的数据:1,4,6,3,9,5,0
    第1次循环的结果:0,4,6,3,9,5,1
    最小的数据为0,用0和最前面的数据交换位置


   第二次比较:
    参与比较的数据:4,6,3,9,5,1
    第2次循环的结果:1,6,3,9,5,4
    最小的数据为1,用1和最前面的数据交换位置
之后依次类推


三、冒泡排序与选择排序的比较

  冒泡排序:

public static void main(String[] args) {
    int[] arr = {1,4,6,3,9,5,0};
    int count = 0; // 测试比较次数
    int count2 = 0; // 测试交换位置次数
    for (int i = arr.length-1; i > 0; i--) {
        for (int j = 0; j < i; j++) {
            count ++;
            if (arr[j] > arr[j+1]){ // 交换位置
                int temp = arr[j];
                arr[j] = arr[j+1];
                arr[j+1] = temp;
                count2 ++;
            }
        }
    }
    for (int i = 0; i < arr.length; i++) {
        System.out.println(arr[i]);
    }
    System.out.println("比较次数="+count); // 21
    System.out.println("交换位置次数="+count2); // 10
}

  2、选择排序:

public static void main(String[] args) {
    int[] arr = {1,4,6,3,9,5,0};
    int count = 0; // 测试比较次数
    int count2 = 0; // 测试交换位置次数
    for (int i = 0; i < arr.length - 1; i++) {
        // i = 0,1,2,3,4,5
        // i 正好是“参与比较的数组”最左边元素的下标
        // 假设起点i下标元素是最小的
        int min = i;
        for (int j = i+1; j < arr.length; j++) {
            count ++;
            if (arr[j]<arr[min]){
                min = j; // 最小元素的下标为j
            }
        }
     // 当i和min相等时,表示猜测是正确的
    // 当i和min不相等时,表示猜测是错误的,存在更小的元素
    // 需要拿着这个更小的元素跟最左边的元素进行交换
    if (min != i){
        count2 ++;
        int temp = arr[min];
        arr[min] = arr[i];
        arr[i] = temp;
    }
  }
  for (int i = 0; i < arr.length; i++) {
    System.out.println(arr[i]);
  }
  System.out.println("比较次数="+count); // 21
  System.out.println("交换位置次数="+count2); // 6
}

总结:同样的数组,冒泡排序与选择排序的比较次数相等,交换次数选择排序比冒泡排序少,不过,在Java中,我们可以调用Arrays类中的sort方法,即Arrays.sort(数组名),来完成冒泡排序

你可能感兴趣的:(关于Java语言中的数组排序--冒泡排序与选择排序的详解,和冒泡排序与选择排序的比较)