所以我有一个MergeSort算法,我想将MergeSort与插入排序结合使用以减少合并的开销,问题是如何?我想使用插入排序对细分进行排序,然后合并。
public class mergesorttest{ public static void main(String[]args){ int d[]= {10,2,3,4,5,6,5,4,3,5,6,7,1}; mergeSort(d,0,d.length); for(int x:d) System.out.print(x+" "); System.out.println(); } static void mergeSort(int f[],int lb, int ub){ //termination reached when a segment of size 1 reached -lb+1=ub if(lb+1<ub){ int mid = (lb+ub)/2; mergeSort(f,lb,mid); mergeSort(f,mid,ub); merge(f,lb,mid,ub); } } static void merge (int f[],int p, int q, int r){ //p<=q<=r int i =p; int j = q; //use temp array to store merged sub-sequence int temp[] = new int[r-p]; int t = 0; while(i<q && j<r){ if(f[i]<=f[j]){ temp[t] =f[i]; i++;t++; } else{ temp[t] = f[j]; j++; t++; } //tag on remaining sequence while(i<q){ temp[t] = f[i]; i++; t++; } while(j<r){ temp[t]=f[j]; j++; t++; } //copy temp back to f i=p;t=0; while(t<temp.length){ f[i]=temp[t]; i++; t++; } } } }
public static void insertion_srt(int array[], int n, int b){ for (int i = 1; i < n; i++){ int j = i; int B = array[i]; while ((j > 0) && (array[j-1] > B)){ array[j] = array[j-1]; j--; } array[j] = B; } }
合并会自动对元素进行排序。但是,当列表低于某个阈值时,可以使用插入排序进行排序:
static final int THRESHOLD = 10; static void mergeSort(int f[],int lb, int ub){ if (ub - lb <= THRESHOLD) insertionSort(f, lb, ub); else { int mid = (lb+ub)/2; mergeSort(f,lb,mid); mergeSort(f,mid,ub); merge(f,lb,mid,ub); } }
进行除此以外的任何操作(除了稍微超出阈值)会 增加 合并排序所花费的时间。
尽管合并排序为O(n log n),插入排序为O(n 2),但是插入排序具有更好的常量,因此在非常小的数组上速度更快。这,这,这和这是我发现的一些相关问题。