冒泡排序(由浅入深,优化)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u011877584/article/details/81557138

package com.fjf.test;

/**
*
* 自己去实践
*
* @author fjf 定义一个数组,按从小到大排出来
*/
public class FjfSort {

public static void main(String[] args) {

    int[] a = { 9, 1, 5, 8, 3, 7, 4, 6, 2 };
    print("原来的数组:", a);

    bubbleSort1(a);
    print("冒泡1(其实是最简单的交换排序)后的数组:", a);

    bubbleSort2(a);
    print("冒泡2(正宗冒泡排序,从后往前冒)后的数组:", a);

    bubbleSort3(a);
    print("冒泡3(正宗冒泡排序,从前往后冒)后的数组:", a);

    bubbleSort4(a);
    print("冒泡4(正宗冒泡排序,添加标识优化)后的数组:", a);
}

/**
 * 冒泡排序1(最基础版本)
 * 
 * @param data
 * 
 *            这个其实算不上 冒泡排序,因为不能满足"两两比较相邻的记录",更应该是最最简单的交换排序
 * 
 *            相当于是按位置找。
 */

static void bubbleSort1(int[] data) {

    for (int i = 0; i < data.length; i++) { // 按照位置来找,先来0位置的, 比较length趟
        for (int j = i + 1; j < data.length; j++) { // 某位置的后它后面的一一比较,找到满足的就交换
            if (data[j] < data[i]) {
                // 交换数据
                int temp = data[j];
                data[j] = data[i];
                data[i] = temp;
            }
        }
    }
}

/**
 * 正宗的冒泡排序
 * 
 * @param data
 *            这个是从后面往前比,小的往上冒。 第一趟比完,小的升到最小索引位置
 */
static void bubbleSort2(int[] data) {
    for (int i = 0; i < data.length - 1; i++) { // 比较的趟数 length-1趟
        for (int j = data.length - 1; j > i; j--) { // 注意这里是从后往前比较 no 小的往上升
            if (data[j] < data[j - 1]) {
                int temp = data[j];
                data[j] = data[i];
                data[i] = temp;
            }
        }
    }
}

/**
 * 冒泡排序,从前往后冒。第一趟比完,最大的数沉入最大索引位置
 * 
 * @param data
 */
static void bubbleSort3(int[] data) {
    for (int i = 0; i < data.length - 1; i++) { // 比较的趟数 length-1趟
        for (int j = i; j < data.length - 1 - i; j++) { // 注意这里是从前往后冒 大的往下沉
            if (data[j] > data[j + 1]) {
                int temp = data[j];
                data[j] = data[i];
                data[i] = temp;
            }
        }
    }
}

/**
 * 冒泡排序优化 
 * 增加标识,如果某趟排过后,整体已经有序,后面的趟数不会再排
 * 
 * @param data
 */
static void bubbleSort4(int[] data) {

    Boolean flag = false; // 最开始的标志位
    for (int i = 0; i < data.length - 1; i++) {

        if (flag) { // 如果flag为true,说明已经有序,后面的趟数就不走了
            break;
        }

        flag = true;
        for (int j = data.length - 1; j > i; j--) {
            if (data[j] < data[j - 1]) {
                int temp = data[j];
                data[j] = data[i];
                data[i] = temp;

                flag = false; // 如果有交换发生,
            }
        }

    }
}

static void print(String str, int[] a) {
    System.out.println(str);
    for (int i = 0; i < a.length; i++) {
        System.out.print(a[i] + " ");
    }
    System.out.println("\n------------------");
}

}

这里写图片描述

猜你喜欢

转载自blog.csdn.net/u011877584/article/details/81557138