排序問題 優化冒泡排序

項目中經常用到排序問題,我們常常用到一些排序算法,例如已有的冒泡排序,快速排序,二分法,歸併排序,堆排序等等,有些排序例如歸併排序非常適合用在數據量非常龐大的情況中,而我們項目一些數量較少的排序,可能很多人就簡單用個冒泡排序就完了,因爲數據少的情況下冒泡排序沒有比其他排序慢很多,而我們接觸排序時,往往會先熟悉冒泡排序。

我在項目中接觸了排序算法,計劃優化項目中的算法時,對已成熟的算法都瞭解了一下。算法的優劣就是看它遍歷的過程經過了多少次,如果n是隊列的長度,冒泡排序就遍歷對比了n的n次方次,已經是最長的一種算法了。後來我自己有了排序的一些想法,通過簡單修改冒泡排序,而整理出一種經過優化過的冒泡排序,我叫它整體冒泡。


    public void bubbleSort(int[] data) {
        for (int i = data.length - 1, j, jIndex; i > 0; i -= jIndex) {
            for (jIndex = 0, j = 0; j < i; j++) {
                sendMsg(data.clone(), j + 1, j - jIndex, j);
                if (data[j + 1] < data[j - jIndex]) {
                    swapHeader(data, j + 1, j - jIndex);
                } else {
                    swapList(data, j + 1, jIndex);
                    jIndex++;
                }
            }
        }
        sendMsg(data.clone());
    }

    public void swapList(int[] data, int i, int jIndex) {
        for (int j = 0; j < jIndex; j++, i--) {
            sendMsg(data.clone(), i, i - 1);
            if (data[i] < data[i - 1]) {
                swap(data, i, i - 1);
            } else {
                return;
            }
        }
    }

    public void swapHeader(int[] data, int max, int min) {
        int temp = data[max];
        for (; max > min; max--) {
            data[max] = data[max - 1];
        }
        data[min] = temp;
    }

整體冒泡的過程就是在冒泡排序的基礎上,在數據頭對比數據時,如果大於對比數據就將數據排序出來,再整體後移一位,直到最終整個數據排序完畢。整體冒泡在速度上比冒泡排序快了三倍左右。

 


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章