1818
1919import java .util .Comparator ;
2020import java .util .List ;
21+ import java .util .Stack ;
2122
2223/**
2324 * see http://de.wikipedia.org/wiki/Quicksort.
@@ -47,12 +48,7 @@ public int compare(Comparable object1, Comparable object2)
4748 */
4849 public static <T > void sort (List <T > list , Comparator <T > cmp )
4950 {
50- int size = list .size ();
51- if (size < 2 )
52- {
53- return ;
54- }
55- quicksort (list , cmp , 0 , size - 1 );
51+ quicksort (list , cmp );
5652 }
5753
5854 /**
@@ -65,15 +61,48 @@ public static <T extends Comparable> void sort(List<T> list)
6561 sort (list , (Comparator <T >) objComp );
6662 }
6763
68- private static <T > void quicksort (List <T > list , Comparator <T > cmp , int left , int right )
64+ private static <T > void quicksort (List <T > list , Comparator <T > cmp )
6965 {
70- if (left < right )
71- {
72- int splitter = split (list , cmp , left , right );
73- quicksort (list , cmp , left , splitter - 1 );
74- quicksort (list , cmp , splitter + 1 , right );
66+ Stack <Integer > stack = new Stack <Integer >();
67+ stack .push (0 );
68+ stack .push (list .size ());
69+ while (!stack .isEmpty ()) {
70+ int right = stack .pop ();
71+ int left = stack .pop ();
72+ if (right - left < 2 ) continue ;
73+ int p = left + ((right -left )/2 );
74+ p = partition (list , cmp , p , left , right );
75+
76+ stack .push (p +1 );
77+ stack .push (right );
78+
79+ stack .push (left );
80+ stack .push (p );
81+
7582 }
7683 }
84+
85+ private static <T > int partition (List <T > list , Comparator <T > cmp , int p , int start , int end ) {
86+ int l = start ;
87+ int h = end - 2 ;
88+ T piv = list .get (p );
89+ swap (list ,p ,end -1 );
90+
91+ while (l < h ) {
92+ if (cmp .compare (list .get (l ), piv ) <= 0 ) {
93+ l ++;
94+ } else if (cmp .compare (piv , list .get (h )) <= 0 ) {
95+ h --;
96+ } else {
97+ swap (list ,l ,h );
98+ }
99+ }
100+ int idx = h ;
101+ if (cmp .compare (list .get (h ), piv ) < 0 ) idx ++;
102+ swap (list ,end -1 ,idx );
103+ return idx ;
104+ }
105+
77106
78107 private static <T > void swap (List <T > list , int i , int j )
79108 {
@@ -82,32 +111,4 @@ private static <T> void swap(List<T> list, int i, int j)
82111 list .set (j , tmp );
83112 }
84113
85- private static <T > int split (List <T > list , Comparator <T > cmp , int left , int right )
86- {
87- int i = left ;
88- int j = right - 1 ;
89- T pivot = list .get (right );
90- do
91- {
92- while (cmp .compare (list .get (i ), pivot ) <= 0 && i < right )
93- {
94- ++i ;
95- }
96- while (cmp .compare (pivot , list .get (j )) <= 0 && j > left )
97- {
98- --j ;
99- }
100- if (i < j )
101- {
102- swap (list , i , j );
103- }
104-
105- } while (i < j );
106-
107- if (cmp .compare (pivot , list .get (i )) < 0 )
108- {
109- swap (list , i , right );
110- }
111- return i ;
112- }
113114}
0 commit comments