思想:
先將原始陣列劃分為n個較小的子陣列,然後對每個子陣列兩兩進行排序並合併為乙個次子陣列時間複雜度:o(n*logn) (最好/壞情況)重複上述過程直到次子陣列的個數為1即為排序後的原始陣列
空間複雜度: 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...