冒泡排序法
重复地走访要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复进行的,直到没有再需要交换的,数列就会排序完成。
** 冒泡排序总和的平均时间复杂度为O(n^2)。冒泡排序是一种稳定的排序算法。**
- 比较相邻的元素,如果第一个比第二个大,就交换他们两个。
- 对每一对相邻元素做同样的工作,从开始第一个到结尾的最后一对。在这一点,最后的元素应该会是最大的。
- 针对所有元素重复以上的步骤,除了最后一个。
- 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
private void bubbleSort(int [] array) {
        for (int j = 0; j < array.length - 1; j++) {
            for (int i = 0;i < array.length -1 -j ;i++) {
                int first = array[i];
                int second = array[1+i];
                if (first > second) {
                    array[i] = second;
                    array[i+1] = first;
                }
            }
        }
    }
优化冒泡排序
如果想优化排序时间,可以提高比较的个数,例如2个改到3个。这样就是减少循环,减少时间复杂度。
private void quickBubbleSort(int [] array) {
        for (int j = 0;j < array.length - 1;j=j+2) {
            for (int i = 1; i < array.length -1 -j; i++) {
                int before = array[i - 1];
                int me = array[i];
                int after = array[i + 1];
                int max = after;
                int index = 2;
                if (max < me) {
                    max = me;
                    index = 1;
                }
                if (max < before) {
                    max = before;
                    index = 0;
                }
                array[i + 1] = max;
                switch(index) {
                    case 0:
                        if (me > after) {
                            array[i -1] = after;
                        } else {
                            array[i - 1] = me;
                            array[i] = after;
                        }
                        break;
                    case 1:
                        if (before < after) {
                            array[i - 1] = before;
                            array[i] = after;
                        } else {
                            array[i - 1] = after;
                            array[i] = before;
                        }
                        break;
                    case 2:
                        if (before > me) {
                            array[i -1] = me;
                            array[i] = before;
                        }
                        break;
                }
            }
        }
    }