0
点赞
收藏
分享

微信扫一扫

Java冒泡排序(包含优化)

司马吹风 2022-04-13 阅读 38
java

冒泡排序思路: 利用交换元素的位置进行排序,两两比较排序的元素,直到结束

冒泡比较的是相邻的两个数,把逆序的数据向后移动,

比较的次数 = 总长度 - 趟数\

我们对数组int[] array{3,1,4,2,5,6,};进行冒泡排序,进行升序排序,

第一趟比较    :  3,1,6,2,5,4  
    第一次比较:  1,3,6,2,5,4   比较的两个数是3和1,交换位置
    第二次比较:  1,3,6,2,5,4   比较的两个数是3和6,不交换位置
     第三次比较:  1,3,2,6,5,4   比较的两个数是6和2,交换位置
     第四次比较:  1,3,2,5,6,4   比较的两个数是6和5,交换位置
      第五次比较:  1,3,2,5,4,6   比较的两个数是6和4,交换位置

第二趟比较    :  1,3,2,5,4,6
     第一次比较:  1,3,2,5,4,6   比较的两个数是1和3,不交换位置
       第二次比较:  1,2,3,5,4,6   比较的两个数是2和2,交换位置
      第三次比较:  1,2,3,5,4,6   比较的两个数是3和5,不交换位置
      第四次比较:  1,2,3,4,5,6   比较的两个数是5和4,交换位置
          不需要和6比较,上一趟已经确认了6是最大的,这一趟,又确认一个最大值:5
   第三趟比较    :  1,2,3,4,5,6
       第一次比较:  1,2,3,4,5,6   比较的两个数是1和2,不交换位置
       第二次比较:  1,2,3,4,5,6   比较的两个数是2和3,不交换位置
       第三次比较:  1,2,3,4,5,6   比较的两个数是3和4,不交换位置
           不需要比较4和5的关系,上一趟确认了最大值的就是4
   第四趟比较    :  1,2,3,4,5,6
      第一次比较:  1,2,3,4,5,6   比较的两个数是1和2,不交换位置
       第二次比较:  1,2,3,4,5,6   比较的两个数是2和3,不交换位置
           不需要比较3和4的关系,上一趟确认了最大值的就是4,本轮确定的最大值就是3
   第五趟比较
      第一次比较:  1,2,3,4,5,6   比较的两个数是1和2,不交换位置
         不需要了 已经排好了,因为这一趟确定要给最大值是2,那剩余的1就一定是最小的

以此类推

在我们了解了冒泡,发现第三趟之后 ,每趟的比较基本没有改变数据,那下一趟是可以取消的  因为冒泡的规则 固定为n-1趟,导致代码依然执行了剩下的几趟循环.
因此我们可以通过布尔值来控制

public static void main(String[] args) {
		int[] array = {3,1,6,2,5,4};
		System.out.println("排序前:\t" + Arrays.toString(array));
            //-- 比较n-1次
		for (int i = 0; i < array.length - 1; i++) {
			boolean flag = false;
			/*
			 * -i 让每一趟 少比较一个数
			 * -1 避免越界  array[j + 1] j 的取值 是< array.length 假设length为10 那j可以取到9 但是一旦执行了j + 1则可以取到10
			 * 会产生越界!!
			 */
			for (int j = 0; j < array.length -1 - i; j++) {
				//-- 大于和小于 决定了 排序的方向是向前还是向后
                //-- 两数交换,当前数和后数交换
				if (array[j] < array[j+1]) {
					int temp = array[j];
					array[j] = array[j + 1];
					array[j+1] = temp;
					flag = true;
				}
			}
			//-- 当前趟 交换一次都没有发生,那下一趟可以不用比较了!
			if(!flag){
				break;
			}
		}
		
		System.out.println("排序后:\t" + Arrays.toString(array));
	}

}

当然Boolean也可以不加,只是为了让这段代码优化而已

下面是不加的代码

public static void main(String[] args) {
		int[] array = {3,1,6,2,5,4};
		System.out.println("排序前:\t" + Arrays.toString(array));

		for (int i = 0; i < array.length - 1; i++) {
			for (int j = 0; j < array.length -1 - i; j++) {
				if (array[j] < array[j+1]) {
					int temp = array[j];
					array[j] = array[j + 1];
					array[j+1] = temp;
				}
			}
		}
		
		System.out.println("排序后:\t" + Arrays.toString(array));
	}

}
举报

相关推荐

0 条评论