2-3 冒泡排序

来源:互联网 发布:淘宝企业店铺需要什么 编辑:程序博客网 时间:2024/05/23 15:33

冒泡排序的基本思想

1、相邻的两个元素进行比较,把比较大的元素排在后面,这样一轮循环下来,就可以找到这一轮循环中最大的那个元素,我们把这个过程形象地称之为“冒泡”。

2、由于每一轮循环都“冒泡”出一个这一轮循环最大的元素,所以上一轮循环的最后一个元素,不应该参加下一轮循环的比较了,这就是为什么内层循环的结束条件是 j < arr.length -i -1 的原因了。

代码实现:

public class BubbleSort implements ISortAlgorithm {    @Override    public String getName() {        return "bubble sort";    }    @Override    public void sort(int[] arr) {        int len = arr.length;        for (int i = 0; i < len - 1; i++) {            for (int j = 0; j < len - i - 1; j++) {                if (arr[j] > arr[j + 1]) {                    swap(arr, j, j + 1);                }            }        }    }    private void swap(int[] arr, int index1, int index2) {        int temp = arr[index1];        arr[index1] = arr[index2];        arr[index2] = temp;    }}

关于代码的说明:

使用一个最极端的例子来理解冒泡排序

当待排序的数组如果是倒序排序的时候,这个“冒泡”的过程就显得非常“好看了”。

代码实现:

控制台打印:

我们应该认识到一点:冒泡排序是可以提前结束的

如果在一轮排序的过程中,没有元素“浮出水面”,那么我们可以认为这个数组就已经是排好序的了,因为下一轮甚至下下一轮循环仍然不会有元素“浮出水面”。

代码实现:

public class BubbleSortOptimize implements ISortAlgorithm {    @Override    public String getName() {        return "optimize bubble sort";    }    @Override    public void sort(int[] arr) {        int len = arr.length;        for (int i = 0; i < len - 1; i++) {            // 是否要进行下一轮循环,默认是要进行下一轮循环的            // 只有在这一轮循环中没有发生元素的交换,才不进行下一轮循环            boolean flag = true;            for (int j = 0; j < len - i - 1; j++) {                if (arr[j] > arr[j + 1]) {                    swap(arr, j, j + 1);                    flag = false;                }            }            if (flag) {                break;            }        }    }    private void swap(int[] arr, int index1, int index2) {        int temp = arr[index1];        arr[index1] = arr[index2];        arr[index2] = temp;    }}

下面以排好序的数组为例进行测试:

/** * 两个版本的冒泡排序性能比较 */@Testpublic void testBubbleSortOptimizeCompare(){    int N = 10000;    int[] sortedArray = new int[N];    for (int i = 0; i < N; i++) {        sortedArray[i] = i;    }    int[] copyFromOldArray = SortTestHelper.copyFromOldArray(sortedArray);    SortTestHelper.testSortEfficiency(new BubbleSort(),sortedArray);    SortTestHelper.testSortEfficiency(new BubbleSortOptimize(),copyFromOldArray);    SortTestHelper.testSorted(sortedArray);    SortTestHelper.testSorted(copyFromOldArray);}

执行结果:

您所使用的排序算法是 => bubble sort

排序算法耗时 => 0.028 秒

您所使用的排序算法是 => optimize bubble sort

排序算法耗时 => 0 秒

给定数组按照升序排序!

给定数组按照升序排序!

原创粉丝点击