2.2 初始化
2.3 迭代
2.4 終止
三、**實現
四、效能
歸併排序的主演算法:
public void mergesort(int t, int low, int high)
int mid = (low + high) >> 1;
mergesort(t, low, mid);
mergesort(t, mid, high);
merge(t, low, mid, high);
}
下面是merge過程的一種簡單實現:
private void merge(int t, int low, int mid, int high)
public void mergesort(int t, int low, int high)
int mid = (low + high) >> 1;
mergesort(t, low, mid);
mergesort(t, mid, high);
merge(t, low, mid, high);
}protected void merge(int t, int low, int mid, int high) else if (t[b] < t[c]) else if (t[a] <= t[c]) else }}
}private void swap(int t, int x, int y)
}
下面的複雜度是根據實驗結果來估計的。
從實驗結果來看,這個merge過程的時間複雜度應該是 o(n*logn),因此整個歸併排序的時間複雜度不會超過 o(n*logn*logn)
空間上,新的merge過程已經不需要在堆上的額外陣列空間的分配。但是在棧上的呼叫深度為o(logn),與歸併排序的主演算法遞迴深度一樣;且當mergesort深度約大時,merge的深度就越小。
歸併排序,空間複雜度O 1 的實現
思路 利用原陣列a的空間,兩個下標i和j分別遍歷l1和l2。注意 當l2當前元素較小時,會覆蓋l1的元素。可以利用插入排序,將arr j 插入到l1中。程式c 實現 include include using namespace std void print int arr,int start,in...
歸併排序空間複雜度O 1 的實現
正常的歸併排序是利用分治法,即分解,解決,合併 o n membery mergesort public void mergesort int nums private void helper int nums1,int b,int e void merge int nums1,int b,int ...
歸併排序,空間複雜度O 1 的實現
題目 陣列a,前面一段是l1,後面一段l2。兩個有序序列l1和l2,利用歸併排序的merge,將陣列a排序。要求 空間複雜度為o 1 思路 利用原陣列a的空間,兩個下標i和j分別遍歷l1和l2。注意 當l2當前元素較小時,會覆蓋l1的元素。可以利用插入排序,將arr j 插入到l1中。程式c 實現 ...