1
+ /*
2
+ Wikipedia says: Cycle sort is an in-place, unstable sorting algorithm,
3
+ a comparison sort that is theoretically optimal in terms of the total
4
+ number of writes to the original array, unlike any other in-place sorting
5
+ algorithm. It is based on the idea that the permutation to be sorted can
6
+ be factored into cycles, which can individually be rotated to give a sorted result.
7
+ */
8
+ function cycleSort ( list ) {
9
+
10
+ let writes = 0 ;
11
+ for ( let cycleStart = 0 ; cycleStart < list . length ; cycleStart ++ ) {
12
+
13
+ let value = list [ cycleStart ] ;
14
+ let position = cycleStart ;
15
+
16
+ // search position
17
+ for ( let i = cycleStart + 1 ; i < list . length ; i ++ ) {
18
+
19
+ if ( list [ i ] < value ) {
20
+ position ++ ;
21
+ }
22
+ }
23
+ // if its the same continue
24
+ if ( position == cycleStart ) {
25
+ continue ;
26
+ }
27
+
28
+ while ( value == list [ position ] ) {
29
+ position ++ ;
30
+ }
31
+
32
+ let oldValue = list [ position ] ;
33
+ list [ position ] = value ;
34
+ value = oldValue ;
35
+ writes ++ ;
36
+
37
+ // rotate the rest
38
+ while ( position != cycleStart ) {
39
+ position = cycleStart ;
40
+ for ( let i = cycleStart + 1 ; i < list . length ; i ++ ) {
41
+
42
+ if ( list [ i ] < value ) {
43
+ position ++ ;
44
+ }
45
+ }
46
+ while ( value == list [ position ] ) {
47
+ position ++ ;
48
+ }
49
+ let oldValueCycle = list [ position ] ;
50
+ list [ position ] = value ;
51
+ value = oldValueCycle ;
52
+ writes ++ ;
53
+ }
54
+ }
55
+ return writes ;
56
+ }
57
+ let arrOrignal = [ 5 , 6 , 7 , 8 , 1 , 2 , 12 , 14 ] ;
58
+ //Array before Sort
59
+ console . log ( arrOrignal ) ;
60
+ cycleSort ( arrOrignal ) ;
61
+ //Array after sort
62
+ console . log ( arrOrignal ) ;
0 commit comments