zoukankan      html  css  js  c++  java
  • Java之冒泡排序

    排序的介绍

    • 排序是将多个数据,依指定的顺序进行排列的过程。

    1. 排序的分类:

    1. 内部排序:
      指将需要处理的所有数据都加载到内部存储器中进行排序。包括(交换式排序法、选择
      式排序法和插入式排序法);
    2. 外部排序法:
      数据量过大,无法全部加载到内存中,需要借助外部存储进行排序。包括(合并排序法和直接合并排序法)。

    2. 冒泡排序法

    • 冒泡排序(Bubble Sorting)的基本思想是:通过对待排序序列从后向前(从下标较大的元素开始),依次比较相邻元素的值,若发现逆序则交换,使值较大的元素逐渐从前移向后部,就像水底下的气泡一样逐渐向上冒。
      在这里插入图片描述

    3. 冒泡排序法案例:

    BubbleSort.java

    • 下面我们举一个具体的案例来说明冒泡法。我们将五个无序:24,69,80,57,13 使用冒泡排序法将其排成一个从小到大的有序数列。
    • 图像分析:
      在这里插入图片描述

    思路:

    • 化繁为简,先死后活
    	数组 [24,69,80,57,13]1轮排序: 目标把最大数放在最后
    	第1次比较[24,69,80,57,13]2次比较[24,69,80,57,13]3次比较[24,69,57,80,13]4次比较[24,69,57,13,80]
    
    	int[] arr = {24, 69, 80, 57, 13};
    	int temp = 0; //用于辅助交换的变量
    
    	for( int j = 0; j < 4; j++) {//4次比较
          	//如果前面的数>后面的数,就交换
          	if(arr[j] > arr[j + 1]) {
          		temp = arr[j];
          		arr[j] = arr[j+1];
          		arr[j+1] = temp;  
          	}
          }
    
          System.out.println("==第1轮==");
          for(int j = 0; j < arr.length; j++) {
          	System.out.print(arr[j] + "\t");
          }
          /*
          第2轮排序: 目标把第二大数放在倒数第二位置
          第1次比较[24,69,57,13,80]
          第2次比较[24,57,69,13,80]
          第3次比较[24,57,13,69,80]
           */
    
          for( int j = 0; j < 3; j++) {//3次比较
          	//如果前面的数>后面的数,就交换
          	if(arr[j] > arr[j + 1]) {
          		temp = arr[j];
          		arr[j] = arr[j+1];
          		arr[j+1] = temp;  
          	}
          }
    
          System.out.println("\n==第2轮==");
          for(int j = 0; j < arr.length; j++) {
          	System.out.print(arr[j] + "\t");
          }
    
    
          //第3轮排序: 目标把第3大数放在倒数第3位置
          //第1次比较[24,57,13,69,80]
          //第2次比较[24,13,57,69,80]
    
    
          for( int j = 0; j < 2; j++) {//2次比较
          	//如果前面的数>后面的数,就交换
          	if(arr[j] > arr[j + 1]) {
          		temp = arr[j];
          		arr[j] = arr[j+1];
          		arr[j+1] = temp;  
          	}
          }
    
          System.out.println("\n==第3轮==");
          for(int j = 0; j < arr.length; j++) {
          	System.out.print(arr[j] + "\t");
          }
    
          /*
          第4轮排序: 目标把第4大数放在倒数第4位置
          第1次比较[13,24,57,69,80]
           */
    
          for( int j = 0; j < 1; j++) {//1次比较
          	//如果前面的数>后面的数,就交换
          	if(arr[j] > arr[j + 1]) {
          		temp = arr[j];
          		arr[j] = arr[j+1];
          		arr[j+1] = temp;  
          	}
          }
    
          System.out.println("\n==第4轮==");
          for(int j = 0; j < arr.length; j++) {
          	System.out.print(arr[j] + "\t");
          }
    

    在这里插入图片描述

    • 将多轮排序使用外层循环包括起来即可
      先死后活 => 4就是 arr.length - 1
    	int[] arr = {24, 69, 80, 57, 13};
    		int temp = 0; //用于辅助交换的变量
    
    		//将多轮排序使用外层循环包括起来即可
    		//先死后活 =》 4就是 arr.length - 1
    	for( int i = 0; i < arr.length - 1; i++) {//外层循环是4次
    	
    		for( int j = 0; j < arr.length - 1 - i; j++) {//4次比较-3次-2次-1次
    			//如果前面的数>后面的数,就交换
    			if(arr[j] > arr[j + 1]) {
    				temp = arr[j];
    				arr[j] = arr[j+1];
    				arr[j+1] = temp;  
    			}
    		}
    		System.out.println("\n==第"+(i+1)+"轮==");
    		for(int j = 0; j < arr.length; j++) {
    			System.out.print(arr[j] + "\t");
    		}
    	
    	}
    

    在这里插入图片描述

  • 相关阅读:
    剑指Offer-11.二进制中1的个数(C++/Java)
    剑指Offer-10.矩形覆盖(C++/Java)
    剑指Offer-9.变态跳台阶(C++/Java)
    UVA 1608 Non-boring sequence 不无聊的序列(分治,中途相遇)
    UVA1607 Gates 与非门电路 (二分)
    UVA 1451 Average平均值 (数形结合,斜率优化)
    UVA 1471 Defense Lines 防线 (LIS变形)
    UVA 1606 Amphiphilic Carbon Molecules 两亲性分子 (极角排序或叉积,扫描法)
    UVA 11134 FabledRooks 传说中的车 (问题分解)
    UVA 1152 4 Values Whose Sum is Zero 和为0的4个值 (中途相遇)
  • 原文地址:https://www.cnblogs.com/xdr630/p/15254642.html
Copyright © 2011-2022 走看看