Java版 原地二路歸併排序

2021-07-15 17:05:49 字數 1329 閱讀 7324

思想:

先將原始陣列劃分為n個較小的子陣列,然後對每個子陣列兩兩進行排序並合併為乙個次子陣列

重複上述過程直到次子陣列的個數為1即為排序後的原始陣列

時間複雜度:o(n*logn) (最好/壞情況)

空間複雜度: o(n)

為了解決原始二路歸併排序空間複雜度較高的情況而產生的,思想很巧妙,很是佩服。它在將原始的空間複雜度由 o(n) 變為 o(1),時間複雜度沒有變。

見部落格:

public

class 歸併排序_要求空間複雜度為o_1 ;

f1(a, 0, a.length - 1);

printresult(a);

}private

static

void

f1(int a, int left, int right)

int middle = (left + right) >> 1; // 以中間點為分割點分割陣列

f1(a, left, middle); // 將left到middle分割

f1(a, middle + 1, right); // 將middle+1到right分割

meger(a, left, middle, right); // 將分割後的陣列合併

}// 原地移動

private

static

void

meger(int a, int left, int middle, int right)

// 然後再找到第二個陣列中比a[i]大的第乙個值

while (j <= right && a[i] > a[j])

// 此時a[left...i-1]均小於a[middle+1...j-1],交換位置並將i前移j-1-middle-1位即可,然後重複

swap(a, i, index-1);

swap(a, index, j - 1);

swap(a, i, j - 1);

i += j - index;

index = j;}}

private

static

void

swap(int a, int i, int j)

while (i <= j)

}private

static

void

printresult(int a)

for (int i = 0; i < a.length; i++)

system.out.println();

}}

2 3 5 6 7 8 9

歸併排序(二路歸併)

歸併排序是一種遞迴思想的體現,通過多次合併較小的幾個 二路歸併為兩個 有序陣列形成新的有序表。思路 將陣列分為n nn個一元組,兩兩合併得到二元組,以此類推共合併log 2n log 2n log2 n 次後,陣列變得有序。時間複雜度為o n logn o nlogn o nlog n 編譯環境de...

java 實現二路歸併排序

歸併排序 是指將兩個或兩個以上有序的數列 或有序表 合併成乙個仍然有序的數列 或有序表 實現二路歸併排序如下 public class mergesort 將兩個子串行尚未處理完的部分複製到temp中 while low1 mid while low2 upper 歸併完成,將temp中的元素複製回...

二路歸併排序

不是困難的演算法,不過也是練習了下遞迴。include include include using namespace std const int maxn 100 5 int a maxn int b maxn void mergesort int a,int b,int begin,int en...