How to fix this non-recursive odd-even-merge sort algorithm?

前端 未结 3 1425
南旧
南旧 2021-01-04 11:00

I was searching for non-recursive odd-even-merge sort algorithm and found 2 sources:

  • a book from Sedgewick R.
  • this SO question

Both alg

3条回答
  •  旧巷少年郎
    2021-01-04 11:30

    The following code works for arrays of any size and isn't recursive. It is a straight port from the implementation of the corresponding function in Perl's Algorithm::Networksort module. The implementation happens to correspond to the algorithm as described by Knuth in The Art of Computer Programming, vol 3 (algorithm 5.2.2M). It doesn't help to actually fix your algorithm, but it at least gives you a working non-recursive implementation of Batcher's odd-even mergesort with only three nested loops :)

    #include 
    #include 
    
    void oddeven_merge_sort(int length)
    {
        int t = ceil(log2(length));
        int p = pow(2, t - 1);
    
        while (p > 0) {
            int q = pow(2, t - 1);
            int r = 0;
            int d = p;
    
            while (d > 0) {
                for (int i = 0 ; i < length - d ; ++i) {
                    if ((i & p) == r) {
                        printf("%2i cmp %2i\n", i, i + d);
                    }
                }
    
                d = q - p;
                q /= 2;
                r = p;
            }
            p /= 2;
        }
    }
    

    If you can get your hands on a copy of The Art of Computer Programming, vol 3, you will have a nice explanation of how and why the algorithm works, as well as a few additional details.

提交回复
热议问题