1
+ package Sorts ;
2
+
3
+ import static Sorts .SortUtils .*;
4
+
5
+ public class CircleSort implements SortAlgorithm {
6
+ /* This method implements the circle sort
7
+ * @param array The array to be sorted
8
+ */
9
+ @ Override
10
+ public <T extends Comparable <T >> T [] sort (T [] array ) {
11
+ int n = array .length ;
12
+ while (doSort (array , 0 , n - 1 ));
13
+ return array ;
14
+ }
15
+
16
+ /* This method implements the cyclic sort recursive version
17
+ * @param array The array to be sorted
18
+ * @param the left boundary of the part currently being sorted
19
+ * @param the right boundary of the part currently being sorted
20
+ */
21
+ private <T extends Comparable <T >> Boolean doSort (T [] array , int left , int right ) {
22
+ Boolean swapped = false ;
23
+
24
+ if (left == right ) {
25
+ return false ;
26
+ }
27
+
28
+ int low = left ;
29
+ int high = right ;
30
+
31
+ while (low < high ) {
32
+ if (array [low ].compareTo (array [high ]) > 0 ) {
33
+ swap (array , low , high );
34
+ swapped = true ;
35
+ }
36
+ low ++;
37
+ high --;
38
+ }
39
+
40
+ if (low == high && array [low ].compareTo (array [high + 1 ]) > 0 ) {
41
+ swap (array , low , high + 1 );
42
+ swapped = true ;
43
+ }
44
+
45
+ int mid = left + (right - left )/2 ;
46
+ Boolean leftHalf = doSort (array , left , mid );
47
+ Boolean rightHalf = doSort (array , mid + 1 , right );
48
+
49
+ return swapped || leftHalf || rightHalf ;
50
+ }
51
+
52
+ /* Driver code*/
53
+ public static void main (String [] args ) {
54
+ CircleSort CSort = new CircleSort ();
55
+
56
+ Integer [] arr = {4 , 23 , 6 , 78 , 1 , 54 , 231 , 9 , 12 };
57
+ CSort .sort (arr );
58
+ for (int i = 0 ; i < arr .length - 1 ; ++i ) {
59
+ assert arr [i ] <= arr [i + 1 ];
60
+ }
61
+
62
+ String [] stringArray = {"c" , "a" , "e" , "b" , "d" };
63
+ CSort .sort (stringArray );
64
+ for (int i = 0 ; i < stringArray .length - 1 ; ++i ) {
65
+ assert arr [i ].compareTo (arr [i + 1 ]) <= 0 ;
66
+ }
67
+ }
68
+ }
0 commit comments