12.07.2015 Views

A Practical Introduction to Data Structures and Algorithm Analysis

A Practical Introduction to Data Structures and Algorithm Analysis

A Practical Introduction to Data Structures and Algorithm Analysis

SHOW MORE
SHOW LESS
  • No tags were found...

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

Sec. 7.4 Mergesort 24736 20 17 13 28 14 23 1520 36 13 17 14 28 15 23131720361415232813 14 15 17 20 23 28 36Figure 7.7 An illustration of Mergesort. The first row shows eight numbers thatare <strong>to</strong> be sorted. Mergesort will recursively subdivide the list in<strong>to</strong> sublists of oneelement each, then recombine the sublists. The second row shows the four sublistsof size 2 created by the first merging pass. The third row shows the two sublistsof size 4 created by the next merging pass on the sublists of row 2. The last rowshows the final sorted list created by merging the two sublists of row 3.Implementing Mergesort presents a number of technical difficulties. The firstdecision is how <strong>to</strong> represent the lists. Mergesort lends itself well <strong>to</strong> sorting a singlylinked list because merging does not require r<strong>and</strong>om access <strong>to</strong> the list elements.Thus, Mergesort is the method of choice when the input is in the form of a linkedlist. Implementing merge for linked lists is straightforward, because we need onlyremove items from the front of the input lists <strong>and</strong> append items <strong>to</strong> the output list.Breaking the input list in<strong>to</strong> two equal halves presents some difficulty. Ideally wewould just break the lists in<strong>to</strong> front <strong>and</strong> back halves. However, even if we know thelength of the list in advance, it would still be necessary <strong>to</strong> traverse halfway downthe linked list <strong>to</strong> reach the beginning of the second half. A simpler method, whichdoes not rely on knowing the length of the list in advance, assigns elements of theinput list alternating between the two sublists. The first element is assigned <strong>to</strong> thefirst sublist, the second element <strong>to</strong> the second sublist, the third <strong>to</strong> first sublist, thefourth <strong>to</strong> the second sublist, <strong>and</strong> so on. This requires one complete pass throughthe input list <strong>to</strong> build the sublists.When the input <strong>to</strong> Mergesort is an array, splitting input in<strong>to</strong> two subarrays iseasy if we know the array bounds. Merging is also easy if we merge the subarraysin<strong>to</strong> a second array. Note that this approach requires twice the amount of spaceas any of the sorting methods presented so far, which is a serious disadvantage forMergesort. It is possible <strong>to</strong> merge the subarrays without using a second array, butthis is extremely difficult <strong>to</strong> do efficiently <strong>and</strong> is not really practical. Merging thetwo subarrays in<strong>to</strong> a second array, while simple <strong>to</strong> implement, presents another difficulty.The merge process ends with the sorted list in the auxiliary array. Considerhow the recursive nature of Mergesort breaks the original array in<strong>to</strong> subarrays, asshown in Figure 7.7. Mergesort is recursively called until subarrays of size 1 havebeen created, requiring log n levels of recursion. These subarrays are merged in<strong>to</strong>

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!