, измененный, чтобы быть гибридом в месте сортировки слиянием / сортировки вставки. Он рекурсивный, поэтому он также использует вспомогательное хранилище в стеке. Кроме того, это не «стабильный» вид.

й день ТАК сообщество,

Я студент CS, в настоящее время выполняю эксперимент, объединяющий MergeSort и InsertionSort. Понятно, что для определенного порога, S, InsertionSort будет иметь более быстрое время выполнения, чем MergeSort. Следовательно, путем объединения обоих алгоритмов сортировки, общее время выполнения будет оптимизировано.

Однако после многократного запуска эксперимента с использованием размера выборки 1000 и различных размеров S результаты эксперимента не дают однозначного ответа каждый раз. Вот картинка с лучшими полученными результатами (обратите внимание, что в половине случаев результат не так определен):

Теперь попробуем тот же код алгоритма с размером выборки 3500:

Наконец, попробуйте тот же код алгоритма с размером выборки 500 000 (обратите внимание, что ось Y находится в миллисекундах:

Хотя по логике Hybrid MergeSort будет быстрее, когда S <= 10, так как InsertionSort не имеет рекурсивных издержек. Однако результаты моего мини эксперимента говорят об обратном.

В настоящее время мне преподают Сложности Времени:

MergeSort: O (n log n)

сортировка вставки:

Лучший случай: θ (n)Худший случай: θ (n ^ 2)

Наконец, я нашел онлайн-источник:https://cs.stackexchange.com/questions/68179/combining-merge-sort-and-insertion-sort в котором говорится, что:

Гибридная сортировка слиянием:

Лучший вариант: θ (n + n log (n / x))В худшем случае: θ (nx + n log (n / x))

Я хотел бы спросить, есть ли результаты в сообществе CS, которые показываютокончательное доказательство того, что алгоритм гибридной слияния MergeSort будет работать лучше, чем обычный алгоритм слияния MergeSort ниже определенного порога 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;
    }

Ответы на вопрос(1)

Ваш ответ на вопрос