日安SO社區,算法:混合歸併和插入排序執行時間
我目前進行的實驗相結合歸併和插入排序一個CS的學生。據瞭解,對於某個閾值,S,InsertionSort的執行時間比MergeSort快。因此,通過合併兩種排序算法,總運行時間將得到優化。
但是,在運行實驗多次後,使用1000的樣本大小和不同大小的S,實驗結果並沒有給出明確的答案。下面是獲得更好的效果的照片(注意時間一半的結果不明確):
現在,3500樣本大小嚐試相同的算法代碼:
最後,試圖用的500000樣本大小相同的算法代碼(請注意,在y軸的單位是毫秒:
雖然在邏輯上,當S < = 10時,Hybrid MergeSort會更快,因爲InsertionSort沒有遞歸開銷時間。但是,我的小型實驗的結果卻另有說明。
目前,這些都是時間複雜度教給我:
歸併:爲O(n log n)的
插入排序:
- 最佳案例:θ(N)
- 最差案例:θ(n^2)
最後,我找到了一個在線來源:https://cs.stackexchange.com/questions/68179/combining-merge-sort-and-insertion-sort,指出:
混合MergeInsertionSort:
- 最佳情況:θ(N + N日誌(N/X))
- 最壞情況:θ(NX + N日誌(N/X) )
我想問一下,如果有結果的CS界,顯示明確的證據證明混合歸併算法會更好地工作比低於某一閾值,S正常歸併算法,如果是這樣,爲什麼?
太謝謝你了SO社區,這可能是一個微不足道的問題,但它真的會澄清,我現在有關於時間複雜度和東西:)許多問題
注:我使用Java進行編碼算法和運行時可能會受到java將數據存儲在內存中的方式的影響。
代碼Java中:
public static int mergeSort2(int n, int m, int s, int[] arr){
int mid = (n+m)/2, right=0, left=0;
if(m-n<=s)
return insertSort(arr,n,m);
else
{
right = mergeSort2(n, mid,s, arr);
left = mergeSort2(mid+1,m,s, arr);
return right+left+merge(n,m,s,arr);
}
}
public static int insertSort(int[] arr, int n, int m){
int temp, comp=0;
for(int i=n+1; i<= m; i++){
for(int j=i; j>n; j--){
comp++;
comparison2++;
if(arr[j]<arr[j-1]){
temp = arr[j];
arr[j] = arr[j-1];
arr[j-1] = temp;
}
else
break;
}
}
return comp;
}
public static void shiftArr(int start, int m, int[] arr){
for(int i=m; i>start; i--)
arr[i] = arr[i-1];
}
public static int merge(int n, int m, int s, int[] arr){
int comp=0;
if(m-n<=s)
return 0;
int mid = (n+m)/2;
int temp, i=n, j=mid+1;
while(i<=mid && j<=m)
{
comp++;
comparison2++;
if(arr[i] >= arr[j])
{
if(i==mid++&&j==m && (arr[i]==arr[j]))
break;
temp = arr[j];
shiftArr(i,j++,arr);
arr[i] = temp;
if(arr[i+1]==arr[i]){
i++;
}
}
i++;
}
return comp;
}
有趣的工作!我不會到這是否是這麼一個很好的問題發言,但我建議還張貼在[計算機科學堆疊交換(https://cs.stackexchange.com)以獲得更多的知名度 – Tyler
@Tyler嗨,是會做,它說我必須再等20分鐘才能將它發佈到CS Stack exchange :) –
3500個元素不足以顯示漸近運行時間。也請包括您的代碼,Java可以輕鬆創建有缺陷的基準。 –