日安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可以轻松创建有缺陷的基准。 –