Объединение MergeSort с сортировкой вставкой, чтобы сделать ее более эффективной

Итак, у меня есть алгоритм 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;
  }
  }

person Rubee    schedule 24.02.2013    source источник


Ответы (1)


Слияние автоматически заботится о сортировке элементов. Однако можно выполнить сортировку с помощью сортировки вставкой, когда список становится ниже некоторого порога:

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), сортировка вставкой имеет лучшие константы и, следовательно, быстрее на очень маленьких массивах. Это, это, это и это несколько вопросов, которые я нашел .

person Bernhard Barker    schedule 25.02.2013
comment
Это хороший ответ, хотя он помогает немного углубиться в теорию Большого О и объяснить лучший / худший / средний случай. - person Visionary Software Solutions; 25.02.2013
comment
Возможно, стоит упомянуть, что именно так работает встроенная сортировка JDK - для массивов ‹7 выполняется сортировка вставкой,› 7 - сортировка слиянием. - person Sean Landsman; 25.02.2013
comment
Я думал, Collections.sort() использовал быструю сортировку для больших коллекций. - person ; 25.02.2013
comment
@bdares Collections.sort + _ 2_ на objects = mergesort. _3 _ примитивы = быстрая сортировка - person Bernhard Barker; 25.02.2013
comment
@VisionarySoftwareSolutions Отредактировано. - person Bernhard Barker; 25.02.2013
comment
Ого, это классная информация, ребята! Есть ли ссылки на соответствующий источник? - person Visionary Software Solutions; 25.02.2013
comment
@VisionarySoftwareSolutions Я предоставил ссылки в своем предыдущем комментарии. Вы также, вероятно, можете проверить исходный код Java. - person Bernhard Barker; 25.02.2013
comment
Я предполагаю, что я спрашивал, доступен ли источник для Arrays.sort () и Collections.sort () без загрузки jdk и перехода в URL-адрес включенных файлов в Интернете для легкого поиска, или если вы придумали эта информация поступила именно так. - person Visionary Software Solutions; 25.02.2013
comment
@VisionarySoftwareSolutions Я только что проверил предоставленные мной ссылки, там написано, какой алгоритм он использует. Но, если хотите - Источник коллекций, Источник массивов < / а>. Обратите внимание: если у вас есть JDK и подходящая среда IDE (NetBeans), открыть исходный код так же просто, как Ctrl + щелчок. - person Bernhard Barker; 25.02.2013
comment
@Dukeling Почему вы взяли mid в mergeSort (f, mid, ub) вместо (mid + 1)? - person ; 18.02.2016