排序——冒泡排序

从小到大排序

冒泡排序:

经过两次循环,在每次小循环的时候,比较左右两个数的大小(若左大右小,则交换顺序),依次比较,得到的是最大的那一个放在n-1处,

然后小循环的范围缩小一个,依次进行比较,找出第二大的,放在n-2处,就像冒泡一样,数字按照从大到小一个一个的冒上来

所以,外面的大循环要控制小循环比较的范围,应该倒序循环

而里面的小循环则依次比较,直到大循环控制的边界处,则将最后的值放在此处即可。

最主要的就是大循环从大到小(确定冒泡范围),小循环从小到大(寻找第i大的值)

注:看结果,到后面会有很多交换其实已经结束了,但是还要继续循环,所以,设置一个exchange来标记,

第i次循环,0 - i-1,i - n 分别为无序和有序

若没有交换的话,证明前边的已经有序,所以不用继续了。

4 2 1 6 3 6 0 -5 1 1
2 1 4 3 6 0 -5 1 1 6
1 2 3 4 0 -5 1 1 6 6
1 2 3 0 -5 1 1 4 6 6
1 2 0 -5 1 1 3 4 6 6
1 0 -5 1 1 2 3 4 6 6
0 -5 1 1 1 2 3 4 6 6
-5 0 1 1 1 2 3 4 6 6
-5 0 1 1 1 2 3 4 6 6
-5 0 1 1 1 2 3 4 6 6(多余的)

public class BubbleSort {
    public void bubbleSort(Integer[] arrays){
        if(arrays.length == 0 || arrays == null) return;
        int len = arrays.length;
        Boolean exchange;
        for(int i = len - 1; i > 0; i--){
            exchange = false;
            for(int j = 0; j < i; j++){
                if(arrays[j] > arrays[j + 1]){
                    swap( arrays, j, j + 1 );
                    exchange = true;
                }
            }
            if(!exchange) return;
        }
    }
    public void swap(Integer[] arrays, int left, int right){
        int temp = arrays[left];
        arrays[left] = arrays[right];
        arrays[right] = temp;
    }

  

  

测试:

import sort.BubbleSort;

import static sort.PrintRes.print;

/**
 * Created by Skye on 2018/3/27.
 */
public class SortTest {

    public static void main(String[] args){

        Integer [] arrays = {4, 7, 9, 1, 8, 5, 2, 6, 3};

        print(arrays);
        BubbleSort bubbleSort = new BubbleSort();
        bubbleSort.bubbleSort(arrays);
        print(arrays);
    }
}

  

print方法

package sort;

/**
 * Created by Skye on 2018/3/27.
 */
public class PrintRes {

    public static void print(Integer[] arrays){
        for(int i = 0; i < arrays.length; i++){
            System.out.print(arrays[i] + " ");
        }
        System.out.println();
    }
}

  

原文地址:https://www.cnblogs.com/SkyeAngel/p/8656335.html