**
核心思想是將兩個有序的數列合併成乙個大的有序的序列。通過遞迴,層層合併,即為歸併
1.當我們要排序這樣乙個陣列的時候,歸併排序法首先將這個陣列分成一半
2.然後繼續把左邊的陣列或者序列,進行劃分,同理右邊的陣列或者序列進行劃分,遞迴劃分
3.分到一定細度的時候,每乙個部分就只有乙個元素了,對他們進行一次簡單的歸併就好了
3.然後把最小的序列,乙個個的進行排序,然後再歸併
public static void main(string args) ;
mergesort(arr);
}public static void mergesort(int arr)
public static void sort(int arr, int l, int r)
int mid = l + ((r - l) >> 1);
sort(arr, l, mid);
sort(arr, mid + 1, r);
merge(arr, l, mid, r);
}public static void merge(int arr, int l, int mid, int r)
// 上面的迴圈退出後,把剩餘的元素依次填入到temp中
// 以下兩個while只有乙個會執行
while(p1 <= mid)
while(p2 <= r)
// 把最終的排序的結果複製給原陣列
for(i = 0; i < temp.length; i++)
}
將乙個運算物件的各二進位制位全部左移若干位(左邊的二進位制位丟棄,右邊補0)。
例:a = a<< 2將a的二進位制位左移2位,右補0,
左移1位後a = a *2;
若左移時捨棄的高位不包含1,則每左移一位,相當於該數乘以2。
將乙個數的各二進位制位全部右移若干位,正數左補0,負數左補1,右邊丟棄。
運算元每右移一位,相當於該數除以2。
例如:a = a>> 2 將a的二進位制位右移2位,
左補0 or 補1得看被移數是正還是負。
運算子把expression1 的所有位向右移 expression2指定的位數。expression1的符號位被用來填充右移後左邊空出來的位。向右移出的位被丟棄。例如,下面的**被求值後,temp 的值是 -4:
-14 (即二進位制的 11110010)右移兩位等於 -4(即二進位制的 11111100)。
var temp = -14 >> 2
注意:
負數在轉換成二進位制的時候,反碼+1變成補碼的時候,也是可以進一位的
其實負數
的:
十進位制變二進位制:原碼–反碼–加一(補碼);
二進位制變十進位制:減一–反碼–原碼。
運算子把 expression1 的各個位向右移expression2 指定的位數。右移後左邊空出的位用零來填充。移出右邊的位被丟棄。例如:var temp = -14 >>>2
變數 temp的值為 -14 (即二進位制的 11111111 11111111 1111111111110010),向右移兩位後等於 1073741820 (即二進位制的 00111111 11111111 1111111111111100)。
時間複雜度:o(nlogn)
空間複雜度:o(n)
,歸併排序需要乙個與原陣列相同長度的陣列做輔助來排序
穩定性:歸併排序是穩定的排序演算法,temp[i++] = arr[p1] <= arr[p2] ? arr[p1++] : arr[p2++];這行**可以保證當左右兩部分的值相等的時候,先複製左邊的值,這樣可以保證值相等的時候兩個元素的相對位置不變
100g的檔案,如何用100m記憶體進行排序?
《演算法闖關記》快速排序
快速排序採用了分而治之的思想,是乙個給基準資料找其正確索引位置的過程.其本質就是把基準數大的都放在基準數的左邊,把比基準數小的放在基準數的右邊,這樣就找到了該資料在陣列中的正確位置 1.首先選取乙個基準資料,arr 0 假設是陣列的起點資料作為基準數 temp,設兩個指示標誌 low指向起始位置,h...
歸併演算法 歸併排序
歸併演算法 歸併排序 這周需要用到歸併演算法,於是找了找相關的資料,整理如下 歸併排序 merge sort 是利用 歸併 技術來進行排序。歸併是指將若干個已排序的子檔案合併成乙個有序的檔案。兩路歸併演算法 1 演算法基本思路 設兩個有序的子檔案 相當於輸入堆 放在同一向量中相鄰的位置上 r low...
歸併排序演算法
include stdafx.h include include include 合併兩段已經排好序的列表 void merge int list int mergelist int left int mid int right else if i mid else 將列表list按照seglen分...