排序

排序始終是個繞不過去的問題 0.0

歸併排序

思路

  • 步驟
    • 劃分問題: 把序列分成元素個數儘量相等的兩半
    • 遞歸求解:把兩半元素分別排序
    • 合併問題:把連個有序表合併成一個
  • 算法的時間複雜度: O(nlogn) (這個我還沒理解)

注意

  • 在上圖中,比如說當序列變成A[i]:38,49,65,97B[j]:13,27,76 並將A和B合併到T中在合併的過程中,都是從A中拿出當前第i個元素和B中第j個元素比較的, 但是到了最後,肯定是某個數組全部的合併到了T中,但是另一個數組中的元素有剩餘,這時間,將剩餘的元素全部合併到T中(在此例中指的A,因爲當B全部進到T中時,A還有97這個元素)

代碼

public static void mergeSort(int x,int y){
    if (y-x > 1){
        int m = x + (y-x)/2;
        int p = x;
        int q = m;
        int i = x;
        mergeSort(x, m);
        mergeSort(m, y);
        while (p<m || q<y){
            if (q >=y || (p<m && data[p] <= data[q])){
                 // 這裏是左半部分進入數組temp的條件,即要麼比右邊的元素小,要麼右邊的元素已經全部進入temp數組
                temp[i++] = data[p++];
            }else{
                temp[i++] = data[q++];
            }
        }
        for ( i=x; i<y; i++){
            data[i] = temp[i];
        }
    }
}

插入排序

思想

  • 其實插入排序就像是打撲克牌:
    • 手裏已經有的牌是有序的
    • 當來一種新牌的時候,則從最後一個牌開始比較,慢慢的向前迭代
    • 如果已有的牌比新牌大,則把已有牌往後移動一個位置
    • 如果已有牌不大,則已有牌的後面插入新牌

代碼

public int[] insertSort(int[] nums) {
        int j,temp;

        for (int i = 1; i < nums.length; i++) {
            temp = nums[i]; 
            for ( j = i; j > 0 && temp > nums[j-1]; j--) {
                nums[j] = nums[j-1]; 
            }

            nums[j] = temp;
        }
        return nums;
    }

快排

代碼

這個算法真是個激動人心的算法

冒泡排序

發佈了76 篇原創文章 · 獲贊 2 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章