1. 程式人生 > 實用技巧 >十大排序演算法

十大排序演算法

1.氣泡排序

氣泡排序的思路就是每次找到陣列中最大的值放到陣列的末尾,

時間複雜度:O(n2)

public void sort(int[] array){
        for(int end = array.length - 1 ; end > 0 ; end--){
            for(int begin = 1 ; begin <= end ;begin++){
                if(array[begin] < array[begin-1]){
                    int temp = array[begin];
                    array[begin] 
= array[begin - 1]; array[begin - 1] = temp; } } } }

氣泡排序的優化1:如果一次迴圈中沒有元素的交換,就說明此時的陣列已經是有序的了,就不用在排序了。

public void sort(int[] array){
        for(int end = array.length - 1 ; end > 0 ; end--){
            boolean sorted = true;
            
for(int begin = 1 ; begin <= end ;begin++){ if(array[begin] < array[begin-1]){ int temp = array[begin]; array[begin] = array[begin - 1]; array[begin - 1] = temp; sorted = false; } }
if(sorted) return; } }

氣泡排序的優化2:用一個int來記錄最後一次交換的索引,當局部有序的時候,可以減少排序的次數.

public static void sort(int[] array){
        for(int end = array.length - 1 ; end > 0 ; end--){
            int sortedIndex = 1;
            for(int begin = 1 ; begin <= end ;begin++){
                if(array[begin] < array[begin-1]){
                    int temp = array[begin];
                    array[begin] = array[begin - 1];
                    array[begin - 1] = temp;
                    sortedIndex = begin;
                }
            }
            end = sortedIndex;
        }
    }

2.選擇排序

記錄陣列中最大的值,一次迴圈之後,在把最大值和陣列最後一個元素進行交換.

與氣泡排序的區別:氣泡排序每進行一次比較,就會有一次交換,但是選擇排序會在一輪迴圈之後在交換,交換次數小於氣泡排序.

public static void sort(int[] array){
        for(int end = array.length - 1 ; end > 0 ; end--){
            int max = 0;
            for(int begin = 1 ; begin <= end ;begin++){
                if(array[begin] > array[max]){
                    max = begin;
                }
            }
            int temp = array[max];
            array[max] = array[end];
            array[end] = temp;
        }
    }

3.堆排序