1+ //Bottom-up mergesort: Java implementation
2+ public class MergeBU
3+ {
4+ private static void merge (Comparable [] a , Comparable [] aux , int lo , int mid , int hi )
5+ {
6+ assert isSorted (a , lo , mid );
7+ // precondition: a[lo..mid] sorted
8+ assert isSorted (a , mid +1 , hi ); // precondition: a[mid+1..hi] sorted
9+ for (int k = lo ; k <= hi ; k ++)
10+ aux [k ] = a [k ];
11+ int i = lo , j = mid +1 ;
12+ for (int k = lo ; k <= hi ; k ++)
13+ {
14+ if (i > mid ) a [k ]=aux [j ++];
15+ else if (j > hi ) a [k ]=aux [i ++];
16+ else if (less (aux [j ], aux [i ])) a [k ]=aux [j ++];
17+ else a [k ]=aux [i ++];
18+ }
19+ assert isSorted (a , lo , hi );
20+
21+ }
22+ private static boolean isSorted (Comparable [] a , int lo , int hi ) {
23+ for (int i = lo + 1 ; i <= hi ; i ++)
24+ if (less (a [i ], a [i -1 ])) return false ;
25+ return true ;
26+ }
27+ private static boolean less (Comparable v , Comparable w )
28+ {
29+ return (v .compareTo (w ) < 0 );
30+ }
31+ //private static void sort(Comparable[] a, Comparable[] aux, int lo, int hi)
32+ //{
33+ //if (hi <= lo) return;// improve this by using insertion sort
34+ //int mid = lo + (hi - lo) / 2;
35+ //sort(a, aux, lo, mid);
36+ //sort(a, aux, mid+1, hi);
37+ ////another improvement
38+ //// if (!less(a[mid+1], a[mid])) return;
39+ //merge(a, aux, lo, mid, hi);
40+ //}
41+ public static void sort (Comparable [] a )
42+ {
43+ int N = a .length ;
44+ Comparable [] aux = new Comparable [N ];
45+ for (int sz = 1 ; sz < N ; sz = sz +sz )
46+ for (int lo = 0 ; lo < N -sz ; lo += sz +sz )
47+ merge (a , aux , lo , lo +sz -1 , Math .min (lo +sz +sz -1 , N -1 ));
48+ }
49+ //Client
50+ public static void main (String [] args ){
51+ // int[] a={4,2,5,2,65,1,6,3,7,2};
52+ String [] a ={"cat" ,"abh" ,"viki" ,"shy" ,"rom" };
53+ for (int p =0 ;p <5 ;p ++)
54+ System .out .print (a [p ]+"," );
55+ System .out .println ("" );
56+ sort (a );
57+ for (int p =0 ;p <5 ;p ++)
58+ System .out .print (a [p ]+"," );
59+ }
60+ }
0 commit comments