《演算法闖關記》 歸併排序

2021-09-26 03:14:06 字數 2034 閱讀 6075

**

核心思想是將兩個有序的數列合併成乙個大的有序的序列。通過遞迴,層層合併,即為歸併

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分...