1. 程式人生 > >排序演算法之一:氣泡排序&選擇排序&插入排序

排序演算法之一:氣泡排序&選擇排序&插入排序

1.氣泡排序

原理:比較兩個相鄰的元素,將值大的元素交換至右端。

複雜度:O(n*n)

思路:依次比較相鄰的兩個數,將小數放在前面,大數放在後面。即在第一趟:首先比較第1個和第2個數,將小數放前,大數放後。然後比較第2個數和第3個數,將小數放前,大數放後,如此繼續,直至比較最後兩個數,將小數放前,大數放後。重複第一趟步驟,直至全部排序完成。

第一趟比較完成後,最後一個數一定是陣列中最大的一個數,所以第二趟比較的時候最後一個數不參與比較;

第二趟比較完成後,倒數第二個數也一定是陣列中第二大的數,所以第三趟比較的時候最後兩個數不參與比較;

依次類推,每一趟比較次數-1;

 public int[] bubbleSort(int[] A, int n) {
        // write code here
        for(int i=0;i<n-1;i++){
            for(int j=0;j<n-1-i;j++){
                if(A[j]>A[j+1]){
                    int temp=A[j];
                    A[j]=A[j+1];
                    A[j+1]=temp;
                }
            }
        }
        return A;
    }

2.選擇排序

原理:選擇排序是一種簡單直觀的排序演算法,其基本原理如下:對於給定的一組記錄,經過第一輪比較後得到最小的記錄,然後將該記錄的位置與第一個記錄的位置交換;接著對不包括第一個記錄以外的其他記錄進行第二次比較,得到最小記錄並與第二個位置記錄交換;重複該過程,知道進行比較的記錄只剩下一個為止。

複雜度:O(n*n)

public int[] selectionSort(int[] A, int n) {
        for(int i=0;i<n;i++){
            for(int j=i+1;j<n;j++){
                if(A[i]>A[j]){
                    int temp=A[i];
                    A[i]=A[j];
                    A[j]=temp;
                }
            }
        }
        // write code here
        return A;
    }

3.插入排序

原理:直接插入排序的基本操作是將一個記錄插入到已經排好的有序表中,從而得到一個新的、記錄數增1的有序表。對於給定的一組記錄,初始時假定第一個記錄自成一個有序序列,其餘記錄為無序序列。接著從第二個記錄開始,按照記錄的大小依次將當前處理的記錄插入到其之前的有序序列中,直到最後一個記錄插到有序序列中為止。
public int[] insertionSort(int[] A, int n) {
        // write code here
        for(int i=1;i<n;i++){
            //如果當前數字比前面一個小
            if(A[i]<A[i-1]){
                int temp=A[i];
                int j=i-1;
                //遍歷當前數字所有的數字,而且前面數字必須大於temp
                for(;j>=0&&temp<A[j];j--){
                    //前面的數賦值給後面的數
                    A[j+1]=A[j];
                }
                A[j+1]=temp;
                
            }
        }
        return A;
    }

複雜度分析:

當最好的情況,也就是要排序的表本身就是有序的,此時只有資料比較,沒有資料移動,時間複雜度為O(n)。 
當最壞的情況,即待排序的表是逆序的情況,此時需要比較次數為:2+3+…+n=(n+2)(n-1)/2 次,而記錄移動的最大值也達到了 (n+4)(n-1)/2 次. 
如果排序記錄是隨機的,那麼根據概率相同的原則,平均比較和移動次數約為次,因此,得出直接插入排序發的時間複雜度為。從這裡可以看出,同樣的是時間複雜度,直接插入排序法比冒泡和簡單選擇排序的效能要好一些。