O 1 空間 的歸併排序

2021-10-25 07:39:14 字數 975 閱讀 3777

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 實現 ...