java基础面试题7--数组高级-冒泡排序

冒泡排序


* 冒泡排序基本概念是:
* 依次比较相邻的两个数,将小数放在前面,大数放在后面。
* 即在第一趟:首先比较第1个和第2个数,将小数放前,大数放后。
* 然后比较第2个数和第3个数,将小数放前,大数放后,如此继续,
* 直至比较最后两个数,将小数放前,大数放后。至此第一趟结束,
* 将最大的数放到了最后。在第二趟:仍从第一对数开始比较
* (因为可能由于第2个数和第3个数的交换,使得第1个数不再小于第2个数),
* 将小数放前,大数放后,一直比较到倒数第二个数(倒数第一的位置上已经是最大的),
* 第二趟结束,在倒数第二的位置上得到一个新的最大数
* (其实在整个数列中是第二大的数)。如此下去,重复以上过程,直至最终完成排序。

掌握主要规律:每一趟遍历总能将最大的数沉底!!!

原理图:
这里写图片描述

package sort;

public class BubbleSort {

    public static void bubbleSort(int [] arr){
//      x:控制外循环趟数,最多需要n-1趟(例:数组长度10,需要比较9趟),
//每一次将最大的数沉底!第一次完毕之后,最大值出现在了最大索引处
        for(int x = 0; x<arr.length-1; x++){
            //y:控制内循环比较次数,比较次数是递减的,因为大的数已经排好了序,放到了最后面,不需要再比较
            for(int y = 0; y<arr.length-1-x; y++){
                if(arr[y] > arr[y+1]){
                    System.out.println("本次交换的数:"+arr[y]+"->"+arr[y+1]);
                    int temp = arr[y];
                    arr[y] = arr[y+1];
                    arr[y+1] = temp;
                }
            }
            System.out.println("第"+(x+1)+"趟比较完的结果:");
            printArray(arr);
        }
    }

    public static void printArray(int [] arr){
        System.out.print("[");
        for(int x=0;x<arr.length;x++){
            if(x==arr.length-1){
                System.out.print(arr[x]+"]");
                System.out.println();
            }else{
                System.out.print(arr[x]+", ");
            }
        }
    }
    /**
     * @param args
     */
    public static void main(String[] args) {

        int [] a = new int[]{10 ,9, 8, 7, 6, 5, 4, 3, 2, 1};
        System.out.println("开始排序");
        printArray(a);

        bubbleSort(a);
        System.out.println("结束排序");
        printArray(a);

    }

}
开始排序
[10, 9, 8, 7, 6, 5, 4, 3, 2, 1]
本次交换的数:10->9
本次交换的数:10->8
本次交换的数:10->7
本次交换的数:10->6
本次交换的数:10->5
本次交换的数:10->4
本次交换的数:10->3
本次交换的数:10->2
本次交换的数:10->11趟比较完的结果:
[9, 8, 7, 6, 5, 4, 3, 2, 1, 10]
本次交换的数:9->8
本次交换的数:9->7
本次交换的数:9->6
本次交换的数:9->5
本次交换的数:9->4
本次交换的数:9->3
本次交换的数:9->2
本次交换的数:9->12趟比较完的结果:
[8, 7, 6, 5, 4, 3, 2, 1, 9, 10]
本次交换的数:8->7
本次交换的数:8->6
本次交换的数:8->5
本次交换的数:8->4
本次交换的数:8->3
本次交换的数:8->2
本次交换的数:8->13趟比较完的结果:
[7, 6, 5, 4, 3, 2, 1, 8, 9, 10]
本次交换的数:7->6
本次交换的数:7->5
本次交换的数:7->4
本次交换的数:7->3
本次交换的数:7->2
本次交换的数:7->14趟比较完的结果:
[6, 5, 4, 3, 2, 1, 7, 8, 9, 10]
本次交换的数:6->5
本次交换的数:6->4
本次交换的数:6->3
本次交换的数:6->2
本次交换的数:6->15趟比较完的结果:
[5, 4, 3, 2, 1, 6, 7, 8, 9, 10]
本次交换的数:5->4
本次交换的数:5->3
本次交换的数:5->2
本次交换的数:5->16趟比较完的结果:
[4, 3, 2, 1, 5, 6, 7, 8, 9, 10]
本次交换的数:4->3
本次交换的数:4->2
本次交换的数:4->17趟比较完的结果:
[3, 2, 1, 4, 5, 6, 7, 8, 9, 10]
本次交换的数:3->2
本次交换的数:3->18趟比较完的结果:
[2, 1, 3, 4, 5, 6, 7, 8, 9, 10]
本次交换的数:2->19趟比较完的结果:
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
结束排序
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

原文地址:https://www.cnblogs.com/shiguangmanbu2016/p/5932818.html