冒泡排序--完整范例的实现测试数据以及核心步骤使用数学方法进行优化 算法笔记

冒泡排序

基本思想

每次比较两个相邻的元素,如果他们顺序错误,就将他们交换过来

一次完整的冒泡算法实现

  • 使用了 java 的 Arrays 类(内置方法输出数组)和 Random 类(随机生成事先规定范围的测试数据)

      import java.util.Arrays;
      import java.util.Random;
      import java.util.Scanner;
    
      public class BubbleSort {
         public static void main(String[] args) {
            System.out.println("请输入想要生成数组的长度");
            Scanner scan = new Scanner(System.in);
            int [] arr = new int [scan.nextInt()];
            for (int i = 0;i<arr.length;i++) {
               Random ran = new Random();	// 生成一个随机种子
               arr[i] = ran.nextInt(100);
            }
            System.out.println("原数组为"+Arrays.toString(arr));
            
            // 冒泡排序
            int temp = 0,step = 0;
            for(int i = 0;i<arr.length;i++) {
               for (int j = i+1;j<arr.length;j++) {
                  if (arr[i]>arr[j]) {
                     temp = arr[i];
                     arr[i] = arr[j];
                     arr[j] = temp;
                  }
                  System.out.println("第"+(++step)+"次冒泡排序"+Arrays.toString(arr));
               }
            }
            System.out.println("冒泡排序后的数组为"+Arrays.toString(arr));
         }
      }
    
  • 随机的测试数据和输出效果

     请输入想要生成数组的长度
     5
     原数组为[60, 96, 34, 84, 52]
     第1次冒泡排序[60, 96, 34, 84, 52]
     第2次冒泡排序[34, 96, 60, 84, 52]
     第3次冒泡排序[34, 96, 60, 84, 52]
     第4次冒泡排序[34, 96, 60, 84, 52]
     第5次冒泡排序[34, 60, 96, 84, 52]
     第6次冒泡排序[34, 60, 96, 84, 52]
     第7次冒泡排序[34, 52, 96, 84, 60]
     第8次冒泡排序[34, 52, 84, 96, 60]
     第9次冒泡排序[34, 52, 60, 96, 84]
     第10次冒泡排序[34, 52, 60, 84, 96]
     冒泡排序后的数组为[34, 52, 60, 84, 96]
    

冒泡排序算法核心步骤

 for(int i = 0;i<array.length;i++) {
 	for (int j = 0;j<array.length-i-1;j++) {
 		if (array[j]>array[j+1]) {
             int temp =0;    //设置临时存储功能的变量
 			temp = array[j];
 			array[j] = array[j+1];
 			array[j+1] = temp;
 		}
 	}
 }

temp 就是起到了这个临时变量的作用

思考背景--原地交换两个数/变量的值

在对经典排序算法进行复习的时候,发现排序算法对数组队列等数组结构中元素的操作大几率会用到交换两个变量的值(在逻辑上表现为交换两个元素的位置),基础操作会是在额外声明一个新变量用于辅助交换元素的临时存值空间,比如
要想做到不使用临时变量存储对两个数进行位置互换(逻辑上),是不是可以通过数学关系上两者的运算来达到这个效果,以下对此优化,做到不使用额外的变量置换两个数(也就是原地交换)

优化方法1:

算数运算(加减)

 x=x+y; //x暂存两数之和
 y=x-y; //y为两数之和减去y,即原来的x
 x=x-y; //x为两数之和减去现在的y(原来的x),变成原来的y
以上对纯数字的值进行操作符合数学关系

把 `x` 看成`array[j]`,`y` 看成`array[j+1]`,将核心代码优化一下
 array[j] = array[j]+array[j+1];
 array[j+1] = array[j] - array[j+1];
 array[j] = array[j] - array[j+1];

优化方法2:

逻辑运算(异或)
 x^=y;//x先存x和y两者的信息
 y^=x;//保持x不变,利用x异或反转y的原始值使其等于x的原始值
 x^=y;//保持y不变,利用x异或反转y的原始值使其等于y的原始值
同理将核心代码优化结果
 array[j] ^= array[j+1];
 array[j+1] ^= array[j];
 array[j] ^= array[j+1];

以上只是对方法的探讨。

posted on 2020-06-08 13:08  CodingAnt_Ricky  阅读(618)  评论(0)    收藏  举报