Java之冒泡排序及优化

设计思路

根据字义就能理解他是相邻的两个数进行比较,比较的结果在与下个进行比较。两次for循环,外循环控制轮数,内循环代表每一轮的冒泡处理,先进行元素比较,在进行元素交换。

java代码:

public class Test {
	//冒泡排序
	public static void main(String[] args) {
		int[] arr = new int[]{1,2,7,4,8};
		for (int i = 1; i < arr.length; i++) {
			for (int j = 0; j < arr.length - i; j++) {
				if(arr[j] > arr[j + 1]) {
					int temp;
					temp = arr[j];
					arr[j] = arr[j + 1];
					arr[j + 1] = temp;
				}
			}
		}
		System.out.println(Arrays.toString(arr));
	}
}

冒泡排序优化

通过标记判断下面的数是有序的可以直接跳出循环,减少循环的次数。

代码如下:

package com.company.arrays;

import java.util.Arrays;

/**
 * <br>
 * <b>类说明: </b> 冒泡排序调优偏第一版
 * <b>作者:   </b> Guo.shiLin
 * <b>日期:   </b> 2018\7\26 0026
 *
 * @version 1.0
 */
public class Sort1 {
    public static void main(String[] args) {
        int[] arrays = {13, 34, 12, 45, 10, 11, 56, 342, 112, 22, 33, 142};
        long startTime = System.currentTimeMillis();
        for (int i = 1; i < arrays.length; i++) {
            //标记,有序集合每次都是true
            boolean flag = true;
            for (int j = 0; j < arrays.length - i; j++) {
                if (arrays[j] > arrays[j + 1]) {
                    int temp;
                    temp = arrays[j + 1];
                    arrays[j + 1] = arrays[j];
                    arrays[j] = temp;
                    //没有序的标记false
                    flag = false;
                }
            }
            if (flag) {
                break;
            }
        }
        long endTime = System.currentTimeMillis() - startTime;
        System.out.println("消耗时间:" + endTime + "ms");
        System.out.println(Arrays.toString(arrays));
    }
}

上面只是做了一个简单的优化,我们还可以深度去优化。可以通过有序边界,和无序 边界来进行优化。

代码如下:

package com.company.arrays;

import java.util.Arrays;

/**
 * <br>
 * <b>类说明: </b> 冒泡排序调优第二篇
 * <b>作者:   </b> Guo.shiLin
 * <b>日期:   </b> 2018\7\26 0026
 *
 * @version 1.0
 */
public class Sort2 {

    public static void main(String[] args) {
        int[] arrays = {13, 34, 12, 45, 10, 11, 56, 342, 112, 22, 33, 142};
        //无序数列的边界,每次比较只需要比到这里为止
        int sortBorder = arrays.length - 1;
        //记录最后一次交换的位置
        int lastExchangeIndex = 0;
        long startTime = System.currentTimeMillis();
        for (int i = 0; i < arrays.length; i++) {
            //标记,每一轮都标记为true。
            boolean flag = true;
            for (int j = 0; j < sortBorder; j++) {
                if (arrays[j] > arrays[j + 1]) {
                    int temp;
                    temp = arrays[j + 1];
                    arrays[j + 1] = arrays[j];
                    arrays[j] = temp;
                    //无序标记为false
                    flag = false;
                    lastExchangeIndex = j;
                }
            }
            //有序的直接结束
            if (flag) {
                break;
            }
            sortBorder = lastExchangeIndex;
        }
        long endTime = System.currentTimeMillis() - startTime;
        System.out.println("消耗时间:" + endTime + "ms");
        System.out.println(Arrays.toString(arrays));
    }
}

猜你喜欢

转载自blog.csdn.net/demo_gsl/article/details/81077714