Why should Insertion Sort be used after threshold crossover in Merge Sort

后端 未结 6 788
鱼传尺愫
鱼传尺愫 2021-01-05 15:12

I have read everywhere that for divide and conquer sorting algorithms like Merge-Sort and Quicksort, instead of recursing until only a single eleme

6条回答
  •  迷失自我
    2021-01-05 15:27

    EDIT: As IVlad points out in a comment, selection sort does only n swaps (and therefore only 3n writes) for any dataset, so insertion sort is very unlikely to beat it on account of doing fewer swaps -- but it will likely do substantially fewer comparisons. The reasoning below better fits a comparison with bubble sort, which will do a similar number of comparisons but many more swaps (and thus many more writes) on average.


    One reason why insertion sort tends to be faster than the other O(n^2) algorithms like bubble sort and selection sort is because in the latter algorithms, every single data movement requires a swap, which can be up to 3 times as many memory copies as are necessary if the other end of the swap needs to be swapped again later.

    With insertion sort OTOH, if the next element to be inserted isn't already the largest element, it can be saved into a temporary location, and all lower elements shunted forward by starting from the right and using single data copies (i.e. without swaps). This opens up a gap to put the original element.

    C code for insertion-sorting integers without using swaps:

    void insertion_sort(int *v, int n) {
        int i = 1;
        while (i < n) {
            int temp = v[i];         // Save the current element here
            int j = i;
    
            // Shunt everything forwards
            while (j > 0 && v[j - 1] > temp) {
                v[j] = v[j - 1];     // Look ma, no swaps!  :)
                --j;
            }
    
            v[j] = temp;
            ++i;
        }
    }
    

提交回复
热议问题