SlideShare a Scribd company logo
1 of 63
Efficient Sorting Algorithms



                                                                  ‣    mergesort
                                                                  ‣    sorting complexity
                                                                  ‣    quicksort
                                                                  ‣    animations


Reference:
  Algorithms in Java, Chapter 7, 8
                                                                   Except as otherwise noted, the content of this presentation
  http://www.cs.princeton.edu/algs4                                is licensed under the Creative Commons Attribution 2.5 License.




 Algorithms in Java, 4th Edition     · Robert Sedgewick and Kevin Wayne · Copyright © 2008             ·    September 2, 2009 2:45:12 AM
Two classic sorting algorithms


Critical components in the world’s computational infrastructure.
•   Full scientific understanding of their properties has enabled us
    to develop them into practical system sorts.
•   Quicksort honored as one of top 10 algorithms of 20th century
    in science and engineering.



Mergesort.
•   Java sort for objects.
•   Perl, Python stable sort.


Quicksort.
•   Java sort for primitive types.
•   C qsort, Unix, g++, Visual C++, Python.



                                                                       2
‣   mergesort
‣   sorting complexity
‣   quicksort
‣   animations




                         3
Mergesort


Basic plan.
•   Divide array into two halves.
•   Recursively sort each half.
•   Merge two halves.



                 input    M   E   R   G   E   S   O   R   T   E   X   A   M   P   L   E
         sort left half   E   E   G   M   O   R   R   S   T   E   X   A   M   P   L   E
        sort right half   E   E   G   M   O   R   R   S   A   E   E   L   M   P   T   X
        merge results     A   E   E   E   E   G   L   M   M   O   P   R   R   S   T   X

                                      Mergesort overview




                                                                                          4
Mergesort trace




                                                           a[]
               lo         hi   0   1   2   3   4   5   6   7 8      9 10 11 12 13 14 15
                               M   E   R   G   E   S   O   R T      E X A M P L E
       merge(a, 0, 0, 1)       E   M   R   G   E   S   O   R T      E X A M P L E
       merge(a, 2, 2, 3)       E   M   G   R   E   S   O   R T      E X A M P L E
     merge(a, 0, 1, 3)         E   G   M   R   E   S   O   R T      E X A M P L E
       merge(a, 4, 4, 5)       E   G   M   R   E   S   O   R T      E X A M P L E
       merge(a, 6, 6, 7)       E   G   M   R   E   S   O   R T      E X A M P L E
     merge(a, 4, 5, 7)         E   G   M   R   E   O   R   S T      E X A M P L E
   merge(a, 0, 3, 7)           E   E   G   M   O   R   R   S T      E X A M P L E
       merge(a, 8, 8, 9)       E   E   G   M   O   R   R   S E      T X A M P L E
       merge(a, 10, 10, 11)    E   E   G   M   O   R   R   S E      T A X M P L E
     merge(a, 8, 9, 11)        E   E   G   M   O   R   R   S A      E T X M P L E
       merge(a, 12, 12, 13)    E   E   G   M   O   R   R   S A      E T X M P L E
       merge(a, 14, 14, 15)    E   E   G   M   O   R   R   S A      E T X M P E L
     merge(a, 12, 13, 15       E   E   G   M   O   R   R   S A      E T X E L M P
   merge(a, 8, 11, 15)         E   E   G   M   O   R   R   S A      E E L M P T X
 merge(a, 0, 7, 15)            A   E   E   E   E   G   L   M M      O P R R S T X
                    Trace of merge results for top-down mergesort


                                                                               result after recursive all



                                                                                                            5
Merging


Goal. Combine two sorted subarrays into a sorted whole.


Q. How to merge efficiently?
A. Use an auxiliary array.


                                               a[]                                           aux[]
                       k   0   1   2   3   4    5    6   7   8   9   i   j   0   1   2   3    4   5   6   7   8   9
              input        E   E   G   M   R     A   C   E   R   T           -   -   -   -    -   -   -   -   -   -
           copy left       E   E   G   M   R    A    C   E   R   T           E   E   G   M   R    -   -   -   -   -
  reverse copy right       E   E   G   M   R    A    C   E   R   T           E   E   G   M   R    T   R   E   C   A
                                                                     0   9
                       0   A                                         0   8   E   E   G   M    R   T   R   E   C   A
                       1   A   C                                     0   7   E   E   G   M    R   T   R   E   C
                       2   A   C   E                                 1   7   E   E   G   M    R   T   R   E
                       3   A   C   E   E                             2   7       E   G   M    R   T   R   E
                       4   A   C   E   E   E                         2   6           G   M    R   T   R   E
      merged result    5   A   C   E   E   E    G                    3   6           G   M    R   T   R
                       6   A   C   E   E   E    G    M               4   6               M    R   T   R
                       7   A   C   E   E   E    G    M   R           5   6                    R   T   R
                       8   A   C   E   E   E    G    M   R   R       5   5                        T   R
                       9   A   C   E   E   E    G    M   R   R   T   6   5                        T
        final result       A   C   E   E   E     G   M   R   R   T

                                                                                                                      6
Merging: Java implementation




        public static void merge(Comparable[] a, int lo, int m, int hi)
        {
           for (int i = lo; i <= m; i++)
                                                                     copy
              aux[i] = a[i];

            for (int j = m+1; j <= hi; j++)
                                                                   reverse copy
               aux[j] = a[hi-j+m+1];

            int i = lo, j = hi;
            for (int k = lo; k <= hi; k++)
                                                                         merge
               if (less(aux[j], aux[i])) a[k] = aux[j--];
               else                      a[k] = aux[i++];
        }




                       lo           i   m         j           hi

               aux[]   A    G   L   O   R     T   S   M   I   H
                                                  k
                a[]    A    G   H   I   L     M


                                                                                  7
Mergesort: Java implementation


       public class Merge
       {
          private static Comparable[] aux;

           private static void merge(Comparable[] a, int lo, int m, int hi)
           { /* as before */ }

           private static void sort(Comparable[] a, int lo, int hi)
           {
              if (hi <= lo) return;
              int m = lo + (hi - lo) / 2;
              sort(a, lo, m);
              sort(a, m+1, hi);
              merge(a, lo, m, hi);
           }

           public static void sort(Comparable[] a)
           {
              aux = new Comparable[a.length];
              sort(a, 0, a.length - 1);
           }
       }

                      lo                       m                   hi



                      10   11   12   13   14   15   16   17   18   19
                                                                              8
Mergesort visualization


                         first subfile



                       second subfile


                          first merge




                     first half sorted




                   second half sorted




                               result


                                  Visual trace of top-down mergesort with cutoff for small subfiles   9
Mergesort: empirical analysis


Running time estimates:
•   Home pc executes 108 comparisons/second.
•   Supercomputer executes 1012 comparisons/second.



                          insertion sort (N2)                   mergesort (N log N)

        computer   thousand     million         billion   thousand    million     billion

          home     instant    2.8 hours    317 years      instant    1 second     18 min

          super    instant     1 second         1 week    instant     instant     instant




Lesson. Good algorithms are better than supercomputers.



                                                                                            10
Mergesort: mathematical analysis


Proposition. Mergesort uses ~ N lg N compares to sort any array of size N.


Def. T(N) = number of compares to mergesort an array of size N.
             = T(N / 2) + T(N / 2) + N

                left half   right half   merge



Mergesort recurrence. T(N) = 2 T(N / 2) + N for N > 1, with T(1) = 0.
•   Not quite right for odd N.
•   Same recurrence holds for many divide-and-conquer algorithms.


Solution. T(N) ~ N lg N.
•   For simplicity, we'll prove when N is a power of 2.
•   True for all N. [see COS 340]




                                                                             11
Mergesort recurrence: proof 1


       Mergesort recurrence. T(N) = 2 T(N / 2) + N for N > 1, with T(1) = 0.


       Proposition. If N is a power of 2, then T(N) = N lg N.
       Pf.
                                                    T(N)                                        N             = N



                               T(N/2)                                 T(N/2)                    2 (N/2)       = N



                    T(N/4)              T(N/4)               T(N/4)             T(N/4)          4 (N/4)       = N
                                                                                                ...

lg N
                                                                                                2k (N/2k)     = N
                                                 T(N / 2 )
                                                        k



                                                                                                ...


             T(2)       T(2)     T(2)       T(2)        T(2)      T(2)         T(2)      T(2)   N/2 (2)       = N


                                                                                                            N lg N
                                                                                                                     12
Mergesort recurrence: proof 2


Mergesort recurrence. T(N) = 2 T(N / 2) + N for N > 1, with T(1) = 0.


Proposition. If N is a power of 2, then T(N) = N lg N.
Pf.

         T(N)   = 2 T(N/2) + N                        given

       T(N) / N = 2 T(N/2) / N + 1                    divide both sides by N

                 = T(N/2) / (N/2) + 1                 algebra

                 = T(N/4) / (N/4) + 1 + 1             apply to first term

                 = T(N/8) / (N/8) + 1 + 1 + 1         apply to first term again

                ...

                 = T(N/N) / (N/N) + 1 + 1 + ... + 1   stop applying, T(1) = 0

                 = lg N




                                                                                  13
Mergesort recurrence: proof 3


Mergesort recurrence. T(N) = 2 T(N / 2) + N for N > 1, with T(1) = 0.


Proposition. If N is a power of 2, then T(N) = N lg N.
Pf. [by induction on N]
•   Base case: N = 1.
•   Inductive hypothesis: T(N) = N lg N.
•   Goal: show that T(2N) = 2N lg (2N).


             T(2N) = 2 T(N) + 2N                  given

                   = 2 N lg N + 2 N               inductive hypothesis

                   = 2 N (lg (2N) - 1) + 2N       algebra

                   = 2 N lg (2N)                  QED




                                                                         14
Mergesort analysis: memory


Proposition G. Mergesort uses extra space proportional to N.
Pf. The array aux[] needs to be of size N for the last merge.



      two sorted subarrays   E   E   G   M   O   R   R   S   A   E   E   L   M   P   T   X
             merged array    A   E   E   E   E   G   L   M   M   O   P   R   R   S   T   X




Def. A sorting algorithm is in-place if it uses O(log N) extra memory.
Ex. Insertion sort, selection sort, shellsort.



Challenge for the bored. In-place merge. [Kronrud, 1969]



                                                                                             15
Mergesort: practical improvements


Use insertion sort for small subarrays.
•   Mergesort has too much overhead for tiny subarrays.
•   Cutoff to insertion sort for ≈ 7 elements.


Stop if already sorted.
•   Is biggest element in first half ≤ smallest element in second half?
•   Helps for nearly ordered lists.

                                         biggest element in left half ≤ smallest element in right half



              two sorted subarrays   A   E   E    E   E    G    L   M    M    O    P   R    R    S   T   X
                     merged array    A   E   E    E   E    G    L   M    M    O    P   R    R    S   T   X




Eliminate the copy to the auxiliary array. Save time (but not space) by
switching the role of the input and auxiliary array in each recursive call.


Ex. See Program 8.4 or Arrays.sort().
                                                                                                             16
Bottom-up mergesort


Basic plan.
•   Pass through array, merging subarrays of size 1.
•   Repeat for subarrays of size 2, 4, 8, 16, ....


                                                                     a[i]
                        lo    m    hi    0   1   2   3   4   5   6   7 8    9 10 11 12 13 14 15
                                         M   E   R   G   E   S   O   R T    E X A M P L E
                merge(a, 0, 0, 1)        E   M   R   G   E   S   O   R T    E X A M P L E
                merge(a, 2, 2, 3)        E   M   G   R   E   S   O   R T    E X A M P L E
                merge(a, 4, 4, 5)        E   G   M   R   E   S   O   R T    E X A M P L E
                merge(a, 6, 6, 7)        E   G   M   R   E   S   O   R T    E X A M P L E
                merge(a, 8, 8, 9)        E   E   G   M   O   R   R   S E    T X A M P L E
                merge(a, 10, 10, 11)     E   E   G   M   O   R   R   S E    T A X M P L E
                merge(a, 12, 12, 13)     E   E   G   M   O   R   R   S A    E T X M P L E
                merge(a, 14, 14, 15)     E   E   G   M   O   R   R   S A    E T X M P E L
              merge(a, 0, 1, 3)          E   G   M   R   E   S   O   R T    E X A M P L E
              merge(a, 4, 5, 7)          E   G   M   R   E   O   R   S T    E X A M P L E
              merge(a, 8, 9, 11)         E   E   G   M   O   R   R   S A    E T X M P L E
              merge(a, 12, 13, 15)       E   E   G   M   O   R   R   S A    E T X E L M P
            merge(a, 0, 3, 7)            E   E   G   M   O   R   R   S T    E X A M P L E
            merge(a, 8, 11, 15)          E   E   G   M   O   R   R   S A    E E L M P T X
          merge(a, 0, 7, 15)             A   E   E   E   E   G   L   M M    O P R R S T X

                             Trace of merge results for bottom-up mergesort

Bottom line. No recursion needed!
                                                                                                  17
Bottom-up mergesort: Java implementation



  public class MergeBU
  {
     private static Comparable[] aux;

      private static void merge(Comparable[] a, int lo, int m, int hi)
      { /* as before */ }

      public   static void sort(Comparable[] a)
      {
         int N = a.length;
         aux = new Comparable[N];
         for (int m = 1; m < N; m = m+m)
            for (int i = 0; i < N-m; i += m+m)
               merge(a, i, i+m, Math.min(i+m+m, N));
      }
  }




Bottom line. Concise industrial-strength code, if you have the space.


                                                                         18
Bottom-up mergesort: visualization




       2



       4



       8



      16



      32




      64




      Visual trace of bottom-up mergesort

                                            19
‣   mergesort
‣   sorting complexity
‣   quicksort
‣   animations




                         20
Complexity of sorting


Computational complexity. Framework to study efficiency of algorithms for
solving a particular problem X.


Machine model. Focus on fundamental operations.
Upper bound. Cost guarantee provided by some algorithm for X.
Lower bound. Proven limit on cost guarantee of any algorithm for X.
Optimal algorithm. Algorithm with best cost guarantee for X.


                                          lower bound ~ upper bound




                                  access information only through compares
Example: sorting.
•   Machine model = # compares.
•   Upper bound = N lg N from mergesort.
•   Lower bound = N lg N ?
•   Optimal algorithm = mergesort ?
                                                                             21
Decision tree




                22
Decision tree


                                a < b

                yes                              no

                       code between comparisons
                      (e.g., sequence of exchanges)




                                                      22
Decision tree


                                             a < b

                        yes                                   no

                                    code between comparisons
                                   (e.g., sequence of exchanges)

                b < c


    yes                       no




                                                                   22
Decision tree


                                             a < b

                        yes                                   no

                                    code between comparisons
                                   (e.g., sequence of exchanges)

                b < c


    yes                       no


     a b c




                                                                   22
Decision tree


                                             a < b

                        yes                                   no

                                    code between comparisons
                                   (e.g., sequence of exchanges)

                b < c


    yes                       no


     a b c                a < c



                yes                         no




                                                                   22
Decision tree


                                             a < b

                        yes                                   no

                                    code between comparisons
                                   (e.g., sequence of exchanges)

                b < c


    yes                       no


     a b c                a < c



                yes                         no



                 a c b




                                                                   22
Decision tree


                                             a < b

                        yes                                   no

                                    code between comparisons
                                   (e.g., sequence of exchanges)

                b < c


    yes                       no


     a b c                a < c



                yes                         no



                 a c b                    c a b




                                                                   22
Decision tree


                                             a < b

                        yes                                   no

                                    code between comparisons
                                   (e.g., sequence of exchanges)

                b < c                                              a < c

    yes                       no                       yes                 no


     a b c                a < c



                yes                         no



                 a c b                    c a b




                                                                                22
Decision tree


                                             a < b

                        yes                                   no

                                    code between comparisons
                                   (e.g., sequence of exchanges)

                b < c                                              a < c

    yes                       no                       yes                 no


     a b c                a < c                           b a c



                yes                         no



                 a c b                    c a b




                                                                                22
Decision tree


                                             a < b

                        yes                                   no

                                    code between comparisons
                                   (e.g., sequence of exchanges)

                b < c                                              a < c

    yes                       no                       yes                 no


     a b c                a < c                           b a c            b < c



                yes                         no                       yes           no




                 a c b                    c a b




                                                                                        22
Decision tree


                                             a < b

                        yes                                   no

                                    code between comparisons
                                   (e.g., sequence of exchanges)

                b < c                                              a < c

    yes                       no                       yes                     no


     a b c                a < c                           b a c                b < c



                yes                         no                       yes               no




                 a c b                    c a b                        b c a




                                                                                            22
Decision tree


                                             a < b

                        yes                                   no

                                    code between comparisons
                                   (e.g., sequence of exchanges)

                b < c                                              a < c

    yes                       no                       yes                     no


     a b c                a < c                           b a c                b < c



                yes                         no                       yes                no




                 a c b                    c a b                        b c a           c b a




                                                                                               22
Compare-based lower bound for sorting


Proposition. Any compare-based sorting algorithm must use more than
N lg N - 1.44 N comparisons in the worst-case.


Pf.
•   Assume input consists of N distinct values a1 through aN.
•   Worst case dictated by height h of decision tree.
•   Binary tree of height h has at most 2 h leaves.
•   N ! different orderings ⇒ at least N ! leaves.




                                                                                    h




        at least N! leaves                                 no more than 2h leaves
                                 Compare tree bounds
                                                                                        23
Compare-based lower bound for sorting


Proposition. Any compare-based sorting algorithm must use more than
N lg N - 1.44 N comparisons in the worst-case.


Pf.
•   Assume input consists of N distinct values a1 through aN.
•   Worst case dictated by height h of decision tree.
•   Binary tree of height h has at most 2 h leaves.
•   N ! different orderings ⇒ at least N ! leaves.



                     2h ≥ N!
                     h ≥ lg N !
                       ≥ lg (N / e) N            Stirling's formula

                       = N lg N - N lg e
                       ≥ N lg N - 1.44 N


                                                                      24
Complexity of sorting


Machine model. Focus on fundamental operations.
Upper bound. Cost guarantee provided by some algorithm for X.
Lower bound. Proven limit on cost guarantee of any algorithm for X.
Optimal algorithm. Algorithm with best cost guarantee for X.


Example: sorting.
•   Machine model = # compares.
•   Upper bound = N lg N from mergesort.
•   Lower bound = N lg N - 1.44 N.
•   Optimal algorithm = mergesort.




First goal of algorithm design: optimal algorithms.



                                                                      25
Complexity results in context


Other operations? Mergesort optimality is only about number of compares.


Space?
•   Mergesort is not optimal with respect to space usage.
•   Insertion sort, selection sort, and shellsort are space-optimal.
•   Is there an algorithm that is both time- and space-optimal?




Lessons. Use theory as a guide.
Ex. Don't try to design sorting algorithm that uses ½ N lg N compares.




                                                                           26
Complexity results in context (continued)


Lower bound may not hold if the algorithm has information about
•   The key values.
•   Their initial arrangement.



Partially ordered arrays. Depending on the initial order of the input,
we may not need N lg N compares.                        insertion sort requires O(N) compares on
                                                        an already sorted array




Duplicate keys. Depending on the input distribution of duplicates,
we may not need N lg N compares.                  stay tuned for 3-way quicksort




Digital properties of keys. We can use digit/character comparisons instead
of key comparisons for numbers and strings.
                                                        stay tuned for radix sorts


                                                                                                   27
‣   mergesort
‣   sorting complexity
‣   quicksort
‣   animations




                         28
Quicksort


Basic plan.
•   Shuffle the array.
•   Partition so that, for some i
    - element a[i] is in place
    - no larger element to the left of i
    - no smaller element to the right of i                                              Sir Charles Antony Richard Hoare
•   Sort each piece recursively.                                                                      1980 Turing Award




                input     Q   U   I   C    K   S    O   R   T   E   X   A   M   P   L   E
               shuffle    E   R   A   T    E   S    L   P   U I M Q C X             O   K
                                                             partitioning element
            partition     E   C   A   I E K         L   P   U T M       Q   R   X   O   S
                                      not greater            not less
              sort left   A   C   E   E    I   K    L   P   U   T   M   Q   R   X   O   S
           sort right     A   C   E   E    I   K    L   M   O   P   Q   R   S   T   U   X
                result    A   C   E   E    I   K    L   M   O   P   Q   R   S   T   U   X
                                          Quicksort overview

                                                                                                                           29
Quicksort partitioning


Basic plan.
•   Scan from left for an item that belongs on the right.
•   Scan from right for item item that belongs on the left.
•   Exchange.
•   Continue until pointers cross.


                                                                        a[i]                                v
                                  i    j    0   1   2   3   4   5   6   7   8   9 10 11 12 13 14 15

               initial values    -1   15    E   R   A   T   E   S   L   P   U   I   M   Q   C   X   O   K

         scan left, scan right    1   12    E   R   A   T   E   S   L   P   U   I   M   Q   C   X   O   K

                   exchange      1    12    E   C   A   T   E   S   L   P   U   I   M   Q   R   X   O   K

         scan left, scan right    3    9    E   C   A   T   E   S   L   P   U   I   M   Q   R   X   O   K

                   exchange       3    9    E   C   A   I   E   S   L   P   U   T   M   Q   R   X   O   K

         scan left, scan right    5    5    E   C   A   I   E   S   L   P   U   T   M   Q   R   X   O   K

              final exchange      5   5     E   C   A   I   E   K   L   P   U   T   M   Q   R   X   O   S

                       result               E   C   A   I   E   K   L   P   U   T   M   Q   R   X   O   S
                           Partitioning trace (array contents before and after each exchange)


                                                                                                                30
Quicksort: Java code for partitioning




private static int partition(Comparable[] a, int lo, int hi)
{
   int i = lo - 1;
   int j = hi;
   while(true)
   {
                                                                             before                                v
        while (less(a[++i], a[hi]))
                                                 find item on left to swap            lo                           hi
           if (i == hi) break;
                                                                             during        v                   v   v

                                                                                                   i       j
        while (less(a[hi], a[--j]))
                                                find item on right to swap
           if (j == lo) break;                                                after            v       v       v

                                                                                      lo               i           hi

                                                                                Quicksort partitioning overview
        if (i >= j) break;                         check if pointers cross


        exch(a, i, j);                                               swap
    }

    exch(a, i, hi);                            swap with partitioning item
    return i;                return index of item now known to be in place
}



                                                                                                                        31
Quicksort: Java implementation




    public class Quick
    {
       public static void sort(Comparable[] a)
       {
          StdRandom.shuffle(a);
          sort(a, 0, a.length - 1);
       }

         private static void sort(Comparable[] a, int lo, int hi)
         {
            if (hi <= lo) return;
            int i = partition(a, lo, hi);
            sort(a, lo, i-1);
            sort(a, i+1, hi);
        }
    }




                                                                    32
Quicksort trace




                        lo     i   hi    0   1   2   3   4   5   6   7   8   9 10 11 12 13 14 15
       initial values                    Q   U   I   C   K   S   O   R   T   E X A M P L E
     random shuffle                      E   R   A   T   E   S   L   P   U   I M Q C X O K
                         0     5   15    E   C   A   I   E   K   L   P   U   T M Q R X O S
                         0     2    4    A   C   E   I   E   K   L   P   U   T M Q R X O S
                         0     1    1    A   C   E   I   E   K   L   P   U   T M Q R X O S
                         0          0    A   C   E   I   E   K   L   P   U   T M Q R X O S
                         3     3    4    A   C   E   E   I   K   L   P   U   T M Q R X O S
                         4          4    A   C   E   E   I   K   L   P   U   T M Q R X O S
                         6    12   15    A   C   E   E   I   K   L   P   O   R M Q S X U T
   no partition          6    10   11    A   C   E   E   I   K   L   P   O   M Q R S X U T
   for subarrays
      of size 1          6     7    9    A   C   E   E   I   K   L   M   O   P Q R S X U T
                         6          6    A   C   E   E   I   K   L   M   O   P Q R S X U T
                         8     9    9    A   C   E   E   I   K   L   M   O   P Q R S X U T
                         8          8    A   C   E   E   I   K   L   M   O   P Q R S X U T
                        11         11    A   C   E   E   I   K   L   M   O   P Q R S X U T
                        13    13   15    A   C   E   E   I   K   L   M   O   P Q R S T U X
                        14    15   15    A   C   E   E   I   K   L   M   O   P Q R S T U X
                        14         14    A   C   E   E   I   K   L   M   O   P Q R S T U X
               result                    A   C   E   E   I   K   L   M   O   P Q R S T U X
                             Quicksort trace (array contents after each partition)



                                                                                                   33
Quicksort: implementation details


Partitioning in-place. Using a spare array makes partitioning easier,
but is not worth the cost.


Terminating the loop. Testing whether the pointers cross is a bit trickier
than it might seem.


Staying in bounds. The (i == hi) test is redundant, but the (j == lo) test is not.


Preserving randomness. Shuffling is key for performance guarantee.


Equal keys. When duplicates are present, it is (counter-intuitively) best
to stop on elements equal to the partitioning element.




                                                                                     34
Quicksort: empirical analysis


   Running time estimates:
   •   Home pc executes 108 comparisons/second.

   •   Supercomputer executes 1012 comparisons/second.



                  insertion sort (N2)                   mergesort (N log N)               quicksort (N log N)


computer   thousand     million         billion   thousand    million     billion   thousand    million         billion


 home      instant    2.8 hours    317 years      instant    1 second     18 min    instant    0.3 sec          6 min


 super     instant     1 second         1 week    instant     instant     instant   instant    instant      instant




   Lesson 1. Good algorithms are better than supercomputers.
   Lesson 2. Great algorithms are better than good ones.

                                                                                                                          35
Quicksort: average-case analysis


Proposition I. The average number of compares CN to quicksort an array of N
elements is ~ 2N ln N (and the number of exchanges is ~ ⅓ N ln N).


Pf. CN satisfies the recurrence C0 = C1 = 0 and for N ≥ 2:

        CN = (N + 1) + (C0 + C1 + ... + CN-1) / N   + (CN-1 + CN-2 + ... + C0) / N

             partitioning        left                              right       partitioning
                                                                               probability

•   Multiply both sides by N and collect terms:

        NCN = N(N + 1) + 2 (C0 + C1 + ... + CN-1)


•   Subtract this from the same equation for N-1:

        NCN - (N - 1) CN = 2N + 2 CN-1


•   Rearrange terms and divide by N(N+1):

        CN / (N+1) = (CN-1 / N) + 2 / (N + 1)

                                                                                              36
Quicksort: average-case analysis


•   From before:

       CN / (N+1) = CN-1 / N + 2 / (N + 1)


•   Repeatedly apply above equation:
       CN / (N + 1) = CN-1 / N + 2 / (N + 1)

                   = CN-2 / (N - 1) + 2/N + 2/(N + 1)

                   = CN-3 / (N - 2) + 2/(N - 1) + 2/N + 2/(N + 1)

                   = 2 ( 1 + 1/2 + 1/3 + . . . + 1/N + 1/(N + 1) )


•   Approximate by an integral:

       CN ≈ 2(N + 1) ( 1 + 1/2 + 1/3 + . . . + 1/N )

           = 2(N + 1) HN ≈ 2(N + 1) ∫1N dx/x

•   Finally, the desired result:

       CN ≈ 2(N + 1) ln N ≈ 1.39 N lg N

                                                                     37
Quicksort: summary of performance characteristics


Worst case. Number of compares is quadratic.
•   N + (N-1) + (N-2) + … + 1 ~ N2 / 2.
•   More likely that your computer is struck by lightning.


Average case. Number of compares is ~ 1.39 N lg N.
•   39% more compares than mergesort.
•   But faster than mergesort in practice because of less data movement.


Random shuffle.
•   Probabilistic guarantee against worst case.
•   Basis for math model that can be validated with experiments.


Caveat emptor. Many textbook implementations go quadratic if input:
•   Is sorted or reverse sorted
•   Has many duplicates (even if randomized!) [stay tuned]


                                                                           38
Quicksort: practical improvements


Median of sample.
•   Best choice of pivot element = median.
•   Estimate true median by taking median of sample.


Insertion sort small files.
•   Even quicksort has too much overhead for tiny files.
•   Can delay insertion sort until end.

                                      ~ 12/7 N lg N comparisons
Optimize parameters.
•   Median-of-3 random elements.
•   Cutoff to insertion sort for ≈ 10 elements.


Non-recursive version.
                                guarantees O(log N) stack size
•   Use explicit stack.
•   Always sort smaller half first.


                                                                  39
Quicksort with cutoff to insertion sort: visualization


                         input
                                        partitioning element
                         result of
                     first partition




                      left subfile
                    partially sorted




                     both subfiles
                    partially sorted


                         result
                                                               40
‣   mergesort
‣   sorting complexity
‣   quicksort
‣   animations




                         41
Mergesort animation


                           done       untouched   merge in progress input




                merge in progress output             auxiliary array
                                                                            42
Mergesort animation




                      43
Mergesort animation




                      43
Botom-up mergesort animation


                        this pass    last pass   merge in progress input




                  merge in progress output          auxiliary array
                                                                           44
Botom-up mergesort animation




                               45
Botom-up mergesort animation




                               45
Quicksort animation

                                     i




                                             first partition




            v




           second partition




                              done       j
                                                               46
Quicksort animation




                      47
Quicksort animation




                      47
Which sorting algorithm?



     data       data   data   data   data   data   data   data
     type       fifo   find   find   exch   hash   exch   exch
     hash       hash   hash   hash   fifo   heap   fifo   fifo
     heap       heap   heap   heap   find   type   heap   find
     sort       exch   leaf   leaf   hash   link   find   hash
     link       less   link   link   heap   list   link   heap
     list       left   list   list   leaf   push   hash   leaf
     push       leaf   push   push   left   sort   left   left
     find       find   root   root   less   find   less   less
     root       lifo   sort   sort   lifo   leaf   path   lifo
     leaf       push   tree   tree   link   root   leaf   link
     tree       tree   type   type   list   tree   lifo   list
     null       null   exch   null   null   left   next   next
     path       path   fifo   path   path   node   root   node
     node       node   left   node   node   null   list   null
     left       list   less   left   push   path   push   path
     less       link   lifo   less   tree   exch   null   push
     exch       sort   next   exch   type   less   swap   root
     sink       sink   node   sink   sink   sink   node   sink
     swim       swim   null   swim   swim   swim   swim   sort
     next       next   path   next   next   fifo   sort   swap
     swap       swap   sink   swap   swap   lifo   type   swim
     fifo       type   swap   fifo   sort   next   sink   tree
     lifo       root   swim   lifo   root   swap   tree   type
     original    ?      ?      ?      ?      ?      ?     sorted


                                                                   48
Which sorting algorithm?



     data        data         data       data        data        data       data       data
     type        fifo         find       find        exch        hash       exch       exch
     hash        hash         hash       hash        fifo        heap       fifo       fifo
     heap        heap         heap       heap        find        type       heap       find
     sort        exch         leaf       leaf        hash        link       find       hash
     link        less         link       link        heap        list       link       heap
     list        left         list       list        leaf        push       hash       leaf
     push        leaf         push       push        left        sort       left       left
     find        find         root       root        less        find       less       less
     root        lifo         sort       sort        lifo        leaf       path       lifo
     leaf        push         tree       tree        link        root       leaf       link
     tree        tree         type       type        list        tree       lifo       list
     null        null         exch       null        null        left       next       next
     path        path         fifo       path        path        node       root       node
     node        node         left       node        node        null       list       null
     left        list         less       left        push        path       push       path
     less        link         lifo       less        tree        exch       null       push
     exch        sort         next       exch        type        less       swap       root
     sink        sink         node       sink        sink        sink       node       sink
     swim        swim         null       swim        swim        swim       swim       sort
     next        next         path       next        next        fifo       sort       swap
     swap        swap         sink       swap        swap        lifo       type       swim
     fifo        type         swap       fifo        sort        next       sink       tree
     lifo        root         swim       lifo        root        swap       tree       type
     original   quicksort   mergesort   insertion   selection   merge BU   shellsort   sorted


                                                                                                49

More Related Content

Similar to Efficient Sorts

Similar to Efficient Sorts (6)

LPEI_ZCNI_Poster
LPEI_ZCNI_PosterLPEI_ZCNI_Poster
LPEI_ZCNI_Poster
 
Set
SetSet
Set
 
EJES Y ARBOLES
EJES Y ARBOLESEJES Y ARBOLES
EJES Y ARBOLES
 
[플래텀 차이나리포트] 2018 중국 신유통 현황
[플래텀 차이나리포트] 2018 중국 신유통 현황[플래텀 차이나리포트] 2018 중국 신유통 현황
[플래텀 차이나리포트] 2018 중국 신유통 현황
 
Complex analysis book by iit
Complex analysis book by iitComplex analysis book by iit
Complex analysis book by iit
 
Algorithm.ppt
Algorithm.pptAlgorithm.ppt
Algorithm.ppt
 

More from Sri Prasanna

More from Sri Prasanna (20)

Qr codes para tech radar
Qr codes para tech radarQr codes para tech radar
Qr codes para tech radar
 
Qr codes para tech radar 2
Qr codes para tech radar 2Qr codes para tech radar 2
Qr codes para tech radar 2
 
Test
TestTest
Test
 
Test
TestTest
Test
 
assds
assdsassds
assds
 
assds
assdsassds
assds
 
asdsa
asdsaasdsa
asdsa
 
dsd
dsddsd
dsd
 
About stacks
About stacksAbout stacks
About stacks
 
About Stacks
About  StacksAbout  Stacks
About Stacks
 
About Stacks
About  StacksAbout  Stacks
About Stacks
 
About Stacks
About  StacksAbout  Stacks
About Stacks
 
About Stacks
About  StacksAbout  Stacks
About Stacks
 
About Stacks
About  StacksAbout  Stacks
About Stacks
 
About Stacks
About StacksAbout Stacks
About Stacks
 
About Stacks
About StacksAbout Stacks
About Stacks
 
Network and distributed systems
Network and distributed systemsNetwork and distributed systems
Network and distributed systems
 
Introduction & Parellelization on large scale clusters
Introduction & Parellelization on large scale clustersIntroduction & Parellelization on large scale clusters
Introduction & Parellelization on large scale clusters
 
Mapreduce: Theory and implementation
Mapreduce: Theory and implementationMapreduce: Theory and implementation
Mapreduce: Theory and implementation
 
Other distributed systems
Other distributed systemsOther distributed systems
Other distributed systems
 

Recently uploaded

POINT- BIOCHEMISTRY SEM 2 ENZYMES UNIT 5.pptx
POINT- BIOCHEMISTRY SEM 2 ENZYMES UNIT 5.pptxPOINT- BIOCHEMISTRY SEM 2 ENZYMES UNIT 5.pptx
POINT- BIOCHEMISTRY SEM 2 ENZYMES UNIT 5.pptxSayali Powar
 
ENGLISH 7_Q4_LESSON 2_ Employing a Variety of Strategies for Effective Interp...
ENGLISH 7_Q4_LESSON 2_ Employing a Variety of Strategies for Effective Interp...ENGLISH 7_Q4_LESSON 2_ Employing a Variety of Strategies for Effective Interp...
ENGLISH 7_Q4_LESSON 2_ Employing a Variety of Strategies for Effective Interp...JhezDiaz1
 
How to Make a Pirate ship Primary Education.pptx
How to Make a Pirate ship Primary Education.pptxHow to Make a Pirate ship Primary Education.pptx
How to Make a Pirate ship Primary Education.pptxmanuelaromero2013
 
call girls in Kamla Market (DELHI) 🔝 >༒9953330565🔝 genuine Escort Service 🔝✔️✔️
call girls in Kamla Market (DELHI) 🔝 >༒9953330565🔝 genuine Escort Service 🔝✔️✔️call girls in Kamla Market (DELHI) 🔝 >༒9953330565🔝 genuine Escort Service 🔝✔️✔️
call girls in Kamla Market (DELHI) 🔝 >༒9953330565🔝 genuine Escort Service 🔝✔️✔️9953056974 Low Rate Call Girls In Saket, Delhi NCR
 
Capitol Tech U Doctoral Presentation - April 2024.pptx
Capitol Tech U Doctoral Presentation - April 2024.pptxCapitol Tech U Doctoral Presentation - April 2024.pptx
Capitol Tech U Doctoral Presentation - April 2024.pptxCapitolTechU
 
Framing an Appropriate Research Question 6b9b26d93da94caf993c038d9efcdedb.pdf
Framing an Appropriate Research Question 6b9b26d93da94caf993c038d9efcdedb.pdfFraming an Appropriate Research Question 6b9b26d93da94caf993c038d9efcdedb.pdf
Framing an Appropriate Research Question 6b9b26d93da94caf993c038d9efcdedb.pdfUjwalaBharambe
 
Earth Day Presentation wow hello nice great
Earth Day Presentation wow hello nice greatEarth Day Presentation wow hello nice great
Earth Day Presentation wow hello nice greatYousafMalik24
 
DATA STRUCTURE AND ALGORITHM for beginners
DATA STRUCTURE AND ALGORITHM for beginnersDATA STRUCTURE AND ALGORITHM for beginners
DATA STRUCTURE AND ALGORITHM for beginnersSabitha Banu
 
Crayon Activity Handout For the Crayon A
Crayon Activity Handout For the Crayon ACrayon Activity Handout For the Crayon A
Crayon Activity Handout For the Crayon AUnboundStockton
 
Painted Grey Ware.pptx, PGW Culture of India
Painted Grey Ware.pptx, PGW Culture of IndiaPainted Grey Ware.pptx, PGW Culture of India
Painted Grey Ware.pptx, PGW Culture of IndiaVirag Sontakke
 
MARGINALIZATION (Different learners in Marginalized Group
MARGINALIZATION (Different learners in Marginalized GroupMARGINALIZATION (Different learners in Marginalized Group
MARGINALIZATION (Different learners in Marginalized GroupJonathanParaisoCruz
 
18-04-UA_REPORT_MEDIALITERAСY_INDEX-DM_23-1-final-eng.pdf
18-04-UA_REPORT_MEDIALITERAСY_INDEX-DM_23-1-final-eng.pdf18-04-UA_REPORT_MEDIALITERAСY_INDEX-DM_23-1-final-eng.pdf
18-04-UA_REPORT_MEDIALITERAСY_INDEX-DM_23-1-final-eng.pdfssuser54595a
 
“Oh GOSH! Reflecting on Hackteria's Collaborative Practices in a Global Do-It...
“Oh GOSH! Reflecting on Hackteria's Collaborative Practices in a Global Do-It...“Oh GOSH! Reflecting on Hackteria's Collaborative Practices in a Global Do-It...
“Oh GOSH! Reflecting on Hackteria's Collaborative Practices in a Global Do-It...Marc Dusseiller Dusjagr
 
Procuring digital preservation CAN be quick and painless with our new dynamic...
Procuring digital preservation CAN be quick and painless with our new dynamic...Procuring digital preservation CAN be quick and painless with our new dynamic...
Procuring digital preservation CAN be quick and painless with our new dynamic...Jisc
 
How to Configure Email Server in Odoo 17
How to Configure Email Server in Odoo 17How to Configure Email Server in Odoo 17
How to Configure Email Server in Odoo 17Celine George
 
Like-prefer-love -hate+verb+ing & silent letters & citizenship text.pdf
Like-prefer-love -hate+verb+ing & silent letters & citizenship text.pdfLike-prefer-love -hate+verb+ing & silent letters & citizenship text.pdf
Like-prefer-love -hate+verb+ing & silent letters & citizenship text.pdfMr Bounab Samir
 
Full Stack Web Development Course for Beginners
Full Stack Web Development Course  for BeginnersFull Stack Web Development Course  for Beginners
Full Stack Web Development Course for BeginnersSabitha Banu
 
Enzyme, Pharmaceutical Aids, Miscellaneous Last Part of Chapter no 5th.pdf
Enzyme, Pharmaceutical Aids, Miscellaneous Last Part of Chapter no 5th.pdfEnzyme, Pharmaceutical Aids, Miscellaneous Last Part of Chapter no 5th.pdf
Enzyme, Pharmaceutical Aids, Miscellaneous Last Part of Chapter no 5th.pdfSumit Tiwari
 
Computed Fields and api Depends in the Odoo 17
Computed Fields and api Depends in the Odoo 17Computed Fields and api Depends in the Odoo 17
Computed Fields and api Depends in the Odoo 17Celine George
 

Recently uploaded (20)

POINT- BIOCHEMISTRY SEM 2 ENZYMES UNIT 5.pptx
POINT- BIOCHEMISTRY SEM 2 ENZYMES UNIT 5.pptxPOINT- BIOCHEMISTRY SEM 2 ENZYMES UNIT 5.pptx
POINT- BIOCHEMISTRY SEM 2 ENZYMES UNIT 5.pptx
 
OS-operating systems- ch04 (Threads) ...
OS-operating systems- ch04 (Threads) ...OS-operating systems- ch04 (Threads) ...
OS-operating systems- ch04 (Threads) ...
 
ENGLISH 7_Q4_LESSON 2_ Employing a Variety of Strategies for Effective Interp...
ENGLISH 7_Q4_LESSON 2_ Employing a Variety of Strategies for Effective Interp...ENGLISH 7_Q4_LESSON 2_ Employing a Variety of Strategies for Effective Interp...
ENGLISH 7_Q4_LESSON 2_ Employing a Variety of Strategies for Effective Interp...
 
How to Make a Pirate ship Primary Education.pptx
How to Make a Pirate ship Primary Education.pptxHow to Make a Pirate ship Primary Education.pptx
How to Make a Pirate ship Primary Education.pptx
 
call girls in Kamla Market (DELHI) 🔝 >༒9953330565🔝 genuine Escort Service 🔝✔️✔️
call girls in Kamla Market (DELHI) 🔝 >༒9953330565🔝 genuine Escort Service 🔝✔️✔️call girls in Kamla Market (DELHI) 🔝 >༒9953330565🔝 genuine Escort Service 🔝✔️✔️
call girls in Kamla Market (DELHI) 🔝 >༒9953330565🔝 genuine Escort Service 🔝✔️✔️
 
Capitol Tech U Doctoral Presentation - April 2024.pptx
Capitol Tech U Doctoral Presentation - April 2024.pptxCapitol Tech U Doctoral Presentation - April 2024.pptx
Capitol Tech U Doctoral Presentation - April 2024.pptx
 
Framing an Appropriate Research Question 6b9b26d93da94caf993c038d9efcdedb.pdf
Framing an Appropriate Research Question 6b9b26d93da94caf993c038d9efcdedb.pdfFraming an Appropriate Research Question 6b9b26d93da94caf993c038d9efcdedb.pdf
Framing an Appropriate Research Question 6b9b26d93da94caf993c038d9efcdedb.pdf
 
Earth Day Presentation wow hello nice great
Earth Day Presentation wow hello nice greatEarth Day Presentation wow hello nice great
Earth Day Presentation wow hello nice great
 
DATA STRUCTURE AND ALGORITHM for beginners
DATA STRUCTURE AND ALGORITHM for beginnersDATA STRUCTURE AND ALGORITHM for beginners
DATA STRUCTURE AND ALGORITHM for beginners
 
Crayon Activity Handout For the Crayon A
Crayon Activity Handout For the Crayon ACrayon Activity Handout For the Crayon A
Crayon Activity Handout For the Crayon A
 
Painted Grey Ware.pptx, PGW Culture of India
Painted Grey Ware.pptx, PGW Culture of IndiaPainted Grey Ware.pptx, PGW Culture of India
Painted Grey Ware.pptx, PGW Culture of India
 
MARGINALIZATION (Different learners in Marginalized Group
MARGINALIZATION (Different learners in Marginalized GroupMARGINALIZATION (Different learners in Marginalized Group
MARGINALIZATION (Different learners in Marginalized Group
 
18-04-UA_REPORT_MEDIALITERAСY_INDEX-DM_23-1-final-eng.pdf
18-04-UA_REPORT_MEDIALITERAСY_INDEX-DM_23-1-final-eng.pdf18-04-UA_REPORT_MEDIALITERAСY_INDEX-DM_23-1-final-eng.pdf
18-04-UA_REPORT_MEDIALITERAСY_INDEX-DM_23-1-final-eng.pdf
 
“Oh GOSH! Reflecting on Hackteria's Collaborative Practices in a Global Do-It...
“Oh GOSH! Reflecting on Hackteria's Collaborative Practices in a Global Do-It...“Oh GOSH! Reflecting on Hackteria's Collaborative Practices in a Global Do-It...
“Oh GOSH! Reflecting on Hackteria's Collaborative Practices in a Global Do-It...
 
Procuring digital preservation CAN be quick and painless with our new dynamic...
Procuring digital preservation CAN be quick and painless with our new dynamic...Procuring digital preservation CAN be quick and painless with our new dynamic...
Procuring digital preservation CAN be quick and painless with our new dynamic...
 
How to Configure Email Server in Odoo 17
How to Configure Email Server in Odoo 17How to Configure Email Server in Odoo 17
How to Configure Email Server in Odoo 17
 
Like-prefer-love -hate+verb+ing & silent letters & citizenship text.pdf
Like-prefer-love -hate+verb+ing & silent letters & citizenship text.pdfLike-prefer-love -hate+verb+ing & silent letters & citizenship text.pdf
Like-prefer-love -hate+verb+ing & silent letters & citizenship text.pdf
 
Full Stack Web Development Course for Beginners
Full Stack Web Development Course  for BeginnersFull Stack Web Development Course  for Beginners
Full Stack Web Development Course for Beginners
 
Enzyme, Pharmaceutical Aids, Miscellaneous Last Part of Chapter no 5th.pdf
Enzyme, Pharmaceutical Aids, Miscellaneous Last Part of Chapter no 5th.pdfEnzyme, Pharmaceutical Aids, Miscellaneous Last Part of Chapter no 5th.pdf
Enzyme, Pharmaceutical Aids, Miscellaneous Last Part of Chapter no 5th.pdf
 
Computed Fields and api Depends in the Odoo 17
Computed Fields and api Depends in the Odoo 17Computed Fields and api Depends in the Odoo 17
Computed Fields and api Depends in the Odoo 17
 

Efficient Sorts

  • 1. Efficient Sorting Algorithms ‣ mergesort ‣ sorting complexity ‣ quicksort ‣ animations Reference: Algorithms in Java, Chapter 7, 8 Except as otherwise noted, the content of this presentation http://www.cs.princeton.edu/algs4 is licensed under the Creative Commons Attribution 2.5 License. Algorithms in Java, 4th Edition · Robert Sedgewick and Kevin Wayne · Copyright © 2008 · September 2, 2009 2:45:12 AM
  • 2. Two classic sorting algorithms Critical components in the world’s computational infrastructure. • Full scientific understanding of their properties has enabled us to develop them into practical system sorts. • Quicksort honored as one of top 10 algorithms of 20th century in science and engineering. Mergesort. • Java sort for objects. • Perl, Python stable sort. Quicksort. • Java sort for primitive types. • C qsort, Unix, g++, Visual C++, Python. 2
  • 3. mergesort ‣ sorting complexity ‣ quicksort ‣ animations 3
  • 4. Mergesort Basic plan. • Divide array into two halves. • Recursively sort each half. • Merge two halves. input M E R G E S O R T E X A M P L E sort left half E E G M O R R S T E X A M P L E sort right half E E G M O R R S A E E L M P T X merge results A E E E E G L M M O P R R S T X Mergesort overview 4
  • 5. Mergesort trace a[] lo hi 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 M E R G E S O R T E X A M P L E merge(a, 0, 0, 1) E M R G E S O R T E X A M P L E merge(a, 2, 2, 3) E M G R E S O R T E X A M P L E merge(a, 0, 1, 3) E G M R E S O R T E X A M P L E merge(a, 4, 4, 5) E G M R E S O R T E X A M P L E merge(a, 6, 6, 7) E G M R E S O R T E X A M P L E merge(a, 4, 5, 7) E G M R E O R S T E X A M P L E merge(a, 0, 3, 7) E E G M O R R S T E X A M P L E merge(a, 8, 8, 9) E E G M O R R S E T X A M P L E merge(a, 10, 10, 11) E E G M O R R S E T A X M P L E merge(a, 8, 9, 11) E E G M O R R S A E T X M P L E merge(a, 12, 12, 13) E E G M O R R S A E T X M P L E merge(a, 14, 14, 15) E E G M O R R S A E T X M P E L merge(a, 12, 13, 15 E E G M O R R S A E T X E L M P merge(a, 8, 11, 15) E E G M O R R S A E E L M P T X merge(a, 0, 7, 15) A E E E E G L M M O P R R S T X Trace of merge results for top-down mergesort result after recursive all 5
  • 6. Merging Goal. Combine two sorted subarrays into a sorted whole. Q. How to merge efficiently? A. Use an auxiliary array. a[] aux[] k 0 1 2 3 4 5 6 7 8 9 i j 0 1 2 3 4 5 6 7 8 9 input E E G M R A C E R T - - - - - - - - - - copy left E E G M R A C E R T E E G M R - - - - - reverse copy right E E G M R A C E R T E E G M R T R E C A 0 9 0 A 0 8 E E G M R T R E C A 1 A C 0 7 E E G M R T R E C 2 A C E 1 7 E E G M R T R E 3 A C E E 2 7 E G M R T R E 4 A C E E E 2 6 G M R T R E merged result 5 A C E E E G 3 6 G M R T R 6 A C E E E G M 4 6 M R T R 7 A C E E E G M R 5 6 R T R 8 A C E E E G M R R 5 5 T R 9 A C E E E G M R R T 6 5 T final result A C E E E G M R R T 6
  • 7. Merging: Java implementation public static void merge(Comparable[] a, int lo, int m, int hi) { for (int i = lo; i <= m; i++) copy aux[i] = a[i]; for (int j = m+1; j <= hi; j++) reverse copy aux[j] = a[hi-j+m+1]; int i = lo, j = hi; for (int k = lo; k <= hi; k++) merge if (less(aux[j], aux[i])) a[k] = aux[j--]; else a[k] = aux[i++]; } lo i m j hi aux[] A G L O R T S M I H k a[] A G H I L M 7
  • 8. Mergesort: Java implementation public class Merge { private static Comparable[] aux; private static void merge(Comparable[] a, int lo, int m, int hi) { /* as before */ } private static void sort(Comparable[] a, int lo, int hi) { if (hi <= lo) return; int m = lo + (hi - lo) / 2; sort(a, lo, m); sort(a, m+1, hi); merge(a, lo, m, hi); } public static void sort(Comparable[] a) { aux = new Comparable[a.length]; sort(a, 0, a.length - 1); } } lo m hi 10 11 12 13 14 15 16 17 18 19 8
  • 9. Mergesort visualization first subfile second subfile first merge first half sorted second half sorted result Visual trace of top-down mergesort with cutoff for small subfiles 9
  • 10. Mergesort: empirical analysis Running time estimates: • Home pc executes 108 comparisons/second. • Supercomputer executes 1012 comparisons/second. insertion sort (N2) mergesort (N log N) computer thousand million billion thousand million billion home instant 2.8 hours 317 years instant 1 second 18 min super instant 1 second 1 week instant instant instant Lesson. Good algorithms are better than supercomputers. 10
  • 11. Mergesort: mathematical analysis Proposition. Mergesort uses ~ N lg N compares to sort any array of size N. Def. T(N) = number of compares to mergesort an array of size N. = T(N / 2) + T(N / 2) + N left half right half merge Mergesort recurrence. T(N) = 2 T(N / 2) + N for N > 1, with T(1) = 0. • Not quite right for odd N. • Same recurrence holds for many divide-and-conquer algorithms. Solution. T(N) ~ N lg N. • For simplicity, we'll prove when N is a power of 2. • True for all N. [see COS 340] 11
  • 12. Mergesort recurrence: proof 1 Mergesort recurrence. T(N) = 2 T(N / 2) + N for N > 1, with T(1) = 0. Proposition. If N is a power of 2, then T(N) = N lg N. Pf. T(N) N = N T(N/2) T(N/2) 2 (N/2) = N T(N/4) T(N/4) T(N/4) T(N/4) 4 (N/4) = N ... lg N 2k (N/2k) = N T(N / 2 ) k ... T(2) T(2) T(2) T(2) T(2) T(2) T(2) T(2) N/2 (2) = N N lg N 12
  • 13. Mergesort recurrence: proof 2 Mergesort recurrence. T(N) = 2 T(N / 2) + N for N > 1, with T(1) = 0. Proposition. If N is a power of 2, then T(N) = N lg N. Pf. T(N) = 2 T(N/2) + N given T(N) / N = 2 T(N/2) / N + 1 divide both sides by N = T(N/2) / (N/2) + 1 algebra = T(N/4) / (N/4) + 1 + 1 apply to first term = T(N/8) / (N/8) + 1 + 1 + 1 apply to first term again ... = T(N/N) / (N/N) + 1 + 1 + ... + 1 stop applying, T(1) = 0 = lg N 13
  • 14. Mergesort recurrence: proof 3 Mergesort recurrence. T(N) = 2 T(N / 2) + N for N > 1, with T(1) = 0. Proposition. If N is a power of 2, then T(N) = N lg N. Pf. [by induction on N] • Base case: N = 1. • Inductive hypothesis: T(N) = N lg N. • Goal: show that T(2N) = 2N lg (2N). T(2N) = 2 T(N) + 2N given = 2 N lg N + 2 N inductive hypothesis = 2 N (lg (2N) - 1) + 2N algebra = 2 N lg (2N) QED 14
  • 15. Mergesort analysis: memory Proposition G. Mergesort uses extra space proportional to N. Pf. The array aux[] needs to be of size N for the last merge. two sorted subarrays E E G M O R R S A E E L M P T X merged array A E E E E G L M M O P R R S T X Def. A sorting algorithm is in-place if it uses O(log N) extra memory. Ex. Insertion sort, selection sort, shellsort. Challenge for the bored. In-place merge. [Kronrud, 1969] 15
  • 16. Mergesort: practical improvements Use insertion sort for small subarrays. • Mergesort has too much overhead for tiny subarrays. • Cutoff to insertion sort for ≈ 7 elements. Stop if already sorted. • Is biggest element in first half ≤ smallest element in second half? • Helps for nearly ordered lists. biggest element in left half ≤ smallest element in right half two sorted subarrays A E E E E G L M M O P R R S T X merged array A E E E E G L M M O P R R S T X Eliminate the copy to the auxiliary array. Save time (but not space) by switching the role of the input and auxiliary array in each recursive call. Ex. See Program 8.4 or Arrays.sort(). 16
  • 17. Bottom-up mergesort Basic plan. • Pass through array, merging subarrays of size 1. • Repeat for subarrays of size 2, 4, 8, 16, .... a[i] lo m hi 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 M E R G E S O R T E X A M P L E merge(a, 0, 0, 1) E M R G E S O R T E X A M P L E merge(a, 2, 2, 3) E M G R E S O R T E X A M P L E merge(a, 4, 4, 5) E G M R E S O R T E X A M P L E merge(a, 6, 6, 7) E G M R E S O R T E X A M P L E merge(a, 8, 8, 9) E E G M O R R S E T X A M P L E merge(a, 10, 10, 11) E E G M O R R S E T A X M P L E merge(a, 12, 12, 13) E E G M O R R S A E T X M P L E merge(a, 14, 14, 15) E E G M O R R S A E T X M P E L merge(a, 0, 1, 3) E G M R E S O R T E X A M P L E merge(a, 4, 5, 7) E G M R E O R S T E X A M P L E merge(a, 8, 9, 11) E E G M O R R S A E T X M P L E merge(a, 12, 13, 15) E E G M O R R S A E T X E L M P merge(a, 0, 3, 7) E E G M O R R S T E X A M P L E merge(a, 8, 11, 15) E E G M O R R S A E E L M P T X merge(a, 0, 7, 15) A E E E E G L M M O P R R S T X Trace of merge results for bottom-up mergesort Bottom line. No recursion needed! 17
  • 18. Bottom-up mergesort: Java implementation public class MergeBU { private static Comparable[] aux; private static void merge(Comparable[] a, int lo, int m, int hi) { /* as before */ } public static void sort(Comparable[] a) { int N = a.length; aux = new Comparable[N]; for (int m = 1; m < N; m = m+m) for (int i = 0; i < N-m; i += m+m) merge(a, i, i+m, Math.min(i+m+m, N)); } } Bottom line. Concise industrial-strength code, if you have the space. 18
  • 19. Bottom-up mergesort: visualization 2 4 8 16 32 64 Visual trace of bottom-up mergesort 19
  • 20. mergesort ‣ sorting complexity ‣ quicksort ‣ animations 20
  • 21. Complexity of sorting Computational complexity. Framework to study efficiency of algorithms for solving a particular problem X. Machine model. Focus on fundamental operations. Upper bound. Cost guarantee provided by some algorithm for X. Lower bound. Proven limit on cost guarantee of any algorithm for X. Optimal algorithm. Algorithm with best cost guarantee for X. lower bound ~ upper bound access information only through compares Example: sorting. • Machine model = # compares. • Upper bound = N lg N from mergesort. • Lower bound = N lg N ? • Optimal algorithm = mergesort ? 21
  • 23. Decision tree a < b yes no code between comparisons (e.g., sequence of exchanges) 22
  • 24. Decision tree a < b yes no code between comparisons (e.g., sequence of exchanges) b < c yes no 22
  • 25. Decision tree a < b yes no code between comparisons (e.g., sequence of exchanges) b < c yes no a b c 22
  • 26. Decision tree a < b yes no code between comparisons (e.g., sequence of exchanges) b < c yes no a b c a < c yes no 22
  • 27. Decision tree a < b yes no code between comparisons (e.g., sequence of exchanges) b < c yes no a b c a < c yes no a c b 22
  • 28. Decision tree a < b yes no code between comparisons (e.g., sequence of exchanges) b < c yes no a b c a < c yes no a c b c a b 22
  • 29. Decision tree a < b yes no code between comparisons (e.g., sequence of exchanges) b < c a < c yes no yes no a b c a < c yes no a c b c a b 22
  • 30. Decision tree a < b yes no code between comparisons (e.g., sequence of exchanges) b < c a < c yes no yes no a b c a < c b a c yes no a c b c a b 22
  • 31. Decision tree a < b yes no code between comparisons (e.g., sequence of exchanges) b < c a < c yes no yes no a b c a < c b a c b < c yes no yes no a c b c a b 22
  • 32. Decision tree a < b yes no code between comparisons (e.g., sequence of exchanges) b < c a < c yes no yes no a b c a < c b a c b < c yes no yes no a c b c a b b c a 22
  • 33. Decision tree a < b yes no code between comparisons (e.g., sequence of exchanges) b < c a < c yes no yes no a b c a < c b a c b < c yes no yes no a c b c a b b c a c b a 22
  • 34. Compare-based lower bound for sorting Proposition. Any compare-based sorting algorithm must use more than N lg N - 1.44 N comparisons in the worst-case. Pf. • Assume input consists of N distinct values a1 through aN. • Worst case dictated by height h of decision tree. • Binary tree of height h has at most 2 h leaves. • N ! different orderings ⇒ at least N ! leaves. h at least N! leaves no more than 2h leaves Compare tree bounds 23
  • 35. Compare-based lower bound for sorting Proposition. Any compare-based sorting algorithm must use more than N lg N - 1.44 N comparisons in the worst-case. Pf. • Assume input consists of N distinct values a1 through aN. • Worst case dictated by height h of decision tree. • Binary tree of height h has at most 2 h leaves. • N ! different orderings ⇒ at least N ! leaves. 2h ≥ N! h ≥ lg N ! ≥ lg (N / e) N Stirling's formula = N lg N - N lg e ≥ N lg N - 1.44 N 24
  • 36. Complexity of sorting Machine model. Focus on fundamental operations. Upper bound. Cost guarantee provided by some algorithm for X. Lower bound. Proven limit on cost guarantee of any algorithm for X. Optimal algorithm. Algorithm with best cost guarantee for X. Example: sorting. • Machine model = # compares. • Upper bound = N lg N from mergesort. • Lower bound = N lg N - 1.44 N. • Optimal algorithm = mergesort. First goal of algorithm design: optimal algorithms. 25
  • 37. Complexity results in context Other operations? Mergesort optimality is only about number of compares. Space? • Mergesort is not optimal with respect to space usage. • Insertion sort, selection sort, and shellsort are space-optimal. • Is there an algorithm that is both time- and space-optimal? Lessons. Use theory as a guide. Ex. Don't try to design sorting algorithm that uses ½ N lg N compares. 26
  • 38. Complexity results in context (continued) Lower bound may not hold if the algorithm has information about • The key values. • Their initial arrangement. Partially ordered arrays. Depending on the initial order of the input, we may not need N lg N compares. insertion sort requires O(N) compares on an already sorted array Duplicate keys. Depending on the input distribution of duplicates, we may not need N lg N compares. stay tuned for 3-way quicksort Digital properties of keys. We can use digit/character comparisons instead of key comparisons for numbers and strings. stay tuned for radix sorts 27
  • 39. mergesort ‣ sorting complexity ‣ quicksort ‣ animations 28
  • 40. Quicksort Basic plan. • Shuffle the array. • Partition so that, for some i - element a[i] is in place - no larger element to the left of i - no smaller element to the right of i Sir Charles Antony Richard Hoare • Sort each piece recursively. 1980 Turing Award input Q U I C K S O R T E X A M P L E shuffle E R A T E S L P U I M Q C X O K partitioning element partition E C A I E K L P U T M Q R X O S not greater not less sort left A C E E I K L P U T M Q R X O S sort right A C E E I K L M O P Q R S T U X result A C E E I K L M O P Q R S T U X Quicksort overview 29
  • 41. Quicksort partitioning Basic plan. • Scan from left for an item that belongs on the right. • Scan from right for item item that belongs on the left. • Exchange. • Continue until pointers cross. a[i] v i j 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 initial values -1 15 E R A T E S L P U I M Q C X O K scan left, scan right 1 12 E R A T E S L P U I M Q C X O K exchange 1 12 E C A T E S L P U I M Q R X O K scan left, scan right 3 9 E C A T E S L P U I M Q R X O K exchange 3 9 E C A I E S L P U T M Q R X O K scan left, scan right 5 5 E C A I E S L P U T M Q R X O K final exchange 5 5 E C A I E K L P U T M Q R X O S result E C A I E K L P U T M Q R X O S Partitioning trace (array contents before and after each exchange) 30
  • 42. Quicksort: Java code for partitioning private static int partition(Comparable[] a, int lo, int hi) { int i = lo - 1; int j = hi; while(true) { before v while (less(a[++i], a[hi])) find item on left to swap lo hi if (i == hi) break; during v v v i j while (less(a[hi], a[--j])) find item on right to swap if (j == lo) break; after v v v lo i hi Quicksort partitioning overview if (i >= j) break; check if pointers cross exch(a, i, j); swap } exch(a, i, hi); swap with partitioning item return i; return index of item now known to be in place } 31
  • 43. Quicksort: Java implementation public class Quick { public static void sort(Comparable[] a) { StdRandom.shuffle(a); sort(a, 0, a.length - 1); } private static void sort(Comparable[] a, int lo, int hi) { if (hi <= lo) return; int i = partition(a, lo, hi); sort(a, lo, i-1); sort(a, i+1, hi); } } 32
  • 44. Quicksort trace lo i hi 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 initial values Q U I C K S O R T E X A M P L E random shuffle E R A T E S L P U I M Q C X O K 0 5 15 E C A I E K L P U T M Q R X O S 0 2 4 A C E I E K L P U T M Q R X O S 0 1 1 A C E I E K L P U T M Q R X O S 0 0 A C E I E K L P U T M Q R X O S 3 3 4 A C E E I K L P U T M Q R X O S 4 4 A C E E I K L P U T M Q R X O S 6 12 15 A C E E I K L P O R M Q S X U T no partition 6 10 11 A C E E I K L P O M Q R S X U T for subarrays of size 1 6 7 9 A C E E I K L M O P Q R S X U T 6 6 A C E E I K L M O P Q R S X U T 8 9 9 A C E E I K L M O P Q R S X U T 8 8 A C E E I K L M O P Q R S X U T 11 11 A C E E I K L M O P Q R S X U T 13 13 15 A C E E I K L M O P Q R S T U X 14 15 15 A C E E I K L M O P Q R S T U X 14 14 A C E E I K L M O P Q R S T U X result A C E E I K L M O P Q R S T U X Quicksort trace (array contents after each partition) 33
  • 45. Quicksort: implementation details Partitioning in-place. Using a spare array makes partitioning easier, but is not worth the cost. Terminating the loop. Testing whether the pointers cross is a bit trickier than it might seem. Staying in bounds. The (i == hi) test is redundant, but the (j == lo) test is not. Preserving randomness. Shuffling is key for performance guarantee. Equal keys. When duplicates are present, it is (counter-intuitively) best to stop on elements equal to the partitioning element. 34
  • 46. Quicksort: empirical analysis Running time estimates: • Home pc executes 108 comparisons/second. • Supercomputer executes 1012 comparisons/second. insertion sort (N2) mergesort (N log N) quicksort (N log N) computer thousand million billion thousand million billion thousand million billion home instant 2.8 hours 317 years instant 1 second 18 min instant 0.3 sec 6 min super instant 1 second 1 week instant instant instant instant instant instant Lesson 1. Good algorithms are better than supercomputers. Lesson 2. Great algorithms are better than good ones. 35
  • 47. Quicksort: average-case analysis Proposition I. The average number of compares CN to quicksort an array of N elements is ~ 2N ln N (and the number of exchanges is ~ ⅓ N ln N). Pf. CN satisfies the recurrence C0 = C1 = 0 and for N ≥ 2: CN = (N + 1) + (C0 + C1 + ... + CN-1) / N + (CN-1 + CN-2 + ... + C0) / N partitioning left right partitioning probability • Multiply both sides by N and collect terms: NCN = N(N + 1) + 2 (C0 + C1 + ... + CN-1) • Subtract this from the same equation for N-1: NCN - (N - 1) CN = 2N + 2 CN-1 • Rearrange terms and divide by N(N+1): CN / (N+1) = (CN-1 / N) + 2 / (N + 1) 36
  • 48. Quicksort: average-case analysis • From before: CN / (N+1) = CN-1 / N + 2 / (N + 1) • Repeatedly apply above equation: CN / (N + 1) = CN-1 / N + 2 / (N + 1) = CN-2 / (N - 1) + 2/N + 2/(N + 1) = CN-3 / (N - 2) + 2/(N - 1) + 2/N + 2/(N + 1) = 2 ( 1 + 1/2 + 1/3 + . . . + 1/N + 1/(N + 1) ) • Approximate by an integral: CN ≈ 2(N + 1) ( 1 + 1/2 + 1/3 + . . . + 1/N ) = 2(N + 1) HN ≈ 2(N + 1) ∫1N dx/x • Finally, the desired result: CN ≈ 2(N + 1) ln N ≈ 1.39 N lg N 37
  • 49. Quicksort: summary of performance characteristics Worst case. Number of compares is quadratic. • N + (N-1) + (N-2) + … + 1 ~ N2 / 2. • More likely that your computer is struck by lightning. Average case. Number of compares is ~ 1.39 N lg N. • 39% more compares than mergesort. • But faster than mergesort in practice because of less data movement. Random shuffle. • Probabilistic guarantee against worst case. • Basis for math model that can be validated with experiments. Caveat emptor. Many textbook implementations go quadratic if input: • Is sorted or reverse sorted • Has many duplicates (even if randomized!) [stay tuned] 38
  • 50. Quicksort: practical improvements Median of sample. • Best choice of pivot element = median. • Estimate true median by taking median of sample. Insertion sort small files. • Even quicksort has too much overhead for tiny files. • Can delay insertion sort until end. ~ 12/7 N lg N comparisons Optimize parameters. • Median-of-3 random elements. • Cutoff to insertion sort for ≈ 10 elements. Non-recursive version. guarantees O(log N) stack size • Use explicit stack. • Always sort smaller half first. 39
  • 51. Quicksort with cutoff to insertion sort: visualization input partitioning element result of first partition left subfile partially sorted both subfiles partially sorted result 40
  • 52. mergesort ‣ sorting complexity ‣ quicksort ‣ animations 41
  • 53. Mergesort animation done untouched merge in progress input merge in progress output auxiliary array 42
  • 56. Botom-up mergesort animation this pass last pass merge in progress input merge in progress output auxiliary array 44
  • 59. Quicksort animation i first partition v second partition done j 46
  • 62. Which sorting algorithm? data data data data data data data data type fifo find find exch hash exch exch hash hash hash hash fifo heap fifo fifo heap heap heap heap find type heap find sort exch leaf leaf hash link find hash link less link link heap list link heap list left list list leaf push hash leaf push leaf push push left sort left left find find root root less find less less root lifo sort sort lifo leaf path lifo leaf push tree tree link root leaf link tree tree type type list tree lifo list null null exch null null left next next path path fifo path path node root node node node left node node null list null left list less left push path push path less link lifo less tree exch null push exch sort next exch type less swap root sink sink node sink sink sink node sink swim swim null swim swim swim swim sort next next path next next fifo sort swap swap swap sink swap swap lifo type swim fifo type swap fifo sort next sink tree lifo root swim lifo root swap tree type original ? ? ? ? ? ? sorted 48
  • 63. Which sorting algorithm? data data data data data data data data type fifo find find exch hash exch exch hash hash hash hash fifo heap fifo fifo heap heap heap heap find type heap find sort exch leaf leaf hash link find hash link less link link heap list link heap list left list list leaf push hash leaf push leaf push push left sort left left find find root root less find less less root lifo sort sort lifo leaf path lifo leaf push tree tree link root leaf link tree tree type type list tree lifo list null null exch null null left next next path path fifo path path node root node node node left node node null list null left list less left push path push path less link lifo less tree exch null push exch sort next exch type less swap root sink sink node sink sink sink node sink swim swim null swim swim swim swim sort next next path next next fifo sort swap swap swap sink swap swap lifo type swim fifo type swap fifo sort next sink tree lifo root swim lifo root swap tree type original quicksort mergesort insertion selection merge BU shellsort sorted 49

Editor's Notes

  1. g++ uses introsort (quicksort with switchover to heapsort for pathological inputs) g++ stablesort is heapsort
  2. Jon von Neumann (left), ENIAC (right). Mergesort was among first programs ever run on earliest computers.
  3. better style not to make aux[] a static variable, but we&apos;re out of horizontal space Subtle bug: why not m = (lo + hi) / 2 ? Breaks if lo + hi overflows an int. This bug was hidden in many implementations for years, including Java system sort.
  4. mergesort with cutoff to insertion sort for small subfiles
  5. Let&apos;s try to understand why
  6. For odd N, need floor(N/2) and ceil(N/2)
  7. cannot fill the memory and sort
  8. ideas discussed in Sedgewick Section 8.4 7 = cutoff value to insertion sort in Arrays.sort() Java Arrays.sort() on objects uses copying trick, in-order trick, and cutoff to insertion sort.
  9. Assume all elements are distinct for simplicity. path from root to leaf describes operation of algorithm on given input this is decision tree for insertion sort
  10. Assume all elements are distinct for simplicity. path from root to leaf describes operation of algorithm on given input this is decision tree for insertion sort
  11. Assume all elements are distinct for simplicity. path from root to leaf describes operation of algorithm on given input this is decision tree for insertion sort
  12. Assume all elements are distinct for simplicity. path from root to leaf describes operation of algorithm on given input this is decision tree for insertion sort
  13. Assume all elements are distinct for simplicity. path from root to leaf describes operation of algorithm on given input this is decision tree for insertion sort
  14. Assume all elements are distinct for simplicity. path from root to leaf describes operation of algorithm on given input this is decision tree for insertion sort
  15. Assume all elements are distinct for simplicity. path from root to leaf describes operation of algorithm on given input this is decision tree for insertion sort
  16. Assume all elements are distinct for simplicity. path from root to leaf describes operation of algorithm on given input this is decision tree for insertion sort
  17. Assume all elements are distinct for simplicity. path from root to leaf describes operation of algorithm on given input this is decision tree for insertion sort
  18. Assume all elements are distinct for simplicity. path from root to leaf describes operation of algorithm on given input this is decision tree for insertion sort
  19. Assume all elements are distinct for simplicity. path from root to leaf describes operation of algorithm on given input this is decision tree for insertion sort
  20. at least one leaf corresponds to each ordering.
  21. mergesort optimal for number of compares, not exchanges or data movement heapsort optimal for time and space
  22. Knuth reports horror stories of bad implementations of partitioning that go quadratic straightforward with auxiliary array, better solution: uses &quot;no&quot; extra space and still N-1 comparisons partitioning uses 2 extra variables, but insignificant compared to n in auxiliary array
  23. For 1 million random items, it is fantastically unlikely that it will take longer than expected. Think roughly the odds of being trampled by a herd of zebra above the Arctic Circle, while being hit by a meteor and lightning.
  24. Median: Number of comparisons close to N log 2 N; FEWER large files; Slightly more exchanges, overhead. All validated with refined math models and experiments
  25. quicksort with cutoff for small subfiles
  26. each column gives one of sorting algorithms at important intermediate stage (selection, insertion, shell, merge, merge BU, quick)