JavaAlgorithms/Sorts/CycleSort.java

72 lines
1.7 KiB
Java
Raw Normal View History

2018-11-14 01:15:47 +08:00
package Sorts;
2018-11-14 01:15:47 +08:00
import static Sorts.SortUtils.less;
import static Sorts.SortUtils.print;
2020-10-24 18:23:28 +08:00
/** @author Podshivalov Nikita (https://github.com/nikitap492) */
class CycleSort implements SortAlgorithm {
2020-10-24 18:23:28 +08:00
@Override
public <T extends Comparable<T>> T[] sort(T[] arr) {
int n = arr.length;
2020-10-24 18:23:28 +08:00
// traverse array elements
for (int j = 0; j <= n - 2; j++) {
// initialize item as starting point
T item = arr[j];
2020-10-24 18:23:28 +08:00
// Find position where we put the item.
int pos = j;
for (int i = j + 1; i < n; i++) if (less(arr[i], item)) pos++;
2020-10-24 18:23:28 +08:00
// If item is already in correct position
if (pos == j) continue;
2020-10-24 18:23:28 +08:00
// ignore all duplicate elements
while (item.compareTo(arr[pos]) == 0) pos += 1;
2020-10-24 18:23:28 +08:00
// put the item to it's right position
if (pos != j) {
item = replace(arr, pos, item);
}
2020-10-24 18:23:28 +08:00
// Rotate rest of the cycle
while (pos != j) {
pos = j;
2020-10-24 18:23:28 +08:00
// Find position where we put the element
for (int i = j + 1; i < n; i++)
if (less(arr[i], item)) {
pos += 1;
}
2020-10-24 18:23:28 +08:00
// ignore all duplicate elements
while (item.compareTo(arr[pos]) == 0) pos += 1;
2020-10-24 18:23:28 +08:00
// put the item to it's right position
if (item != arr[pos]) {
item = replace(arr, pos, item);
}
2020-10-24 18:23:28 +08:00
}
}
2020-10-24 18:23:28 +08:00
return arr;
}
2020-10-24 18:23:28 +08:00
private <T extends Comparable<T>> T replace(T[] arr, int pos, T item) {
T temp = item;
item = arr[pos];
arr[pos] = temp;
return item;
}
2020-10-24 18:23:28 +08:00
public static void main(String[] args) {
Integer arr[] = {4, 23, 6, 78, 1, 26, 11, 23, 0, -6, 3, 54, 231, 9, 12};
CycleSort cycleSort = new CycleSort();
cycleSort.sort(arr);
2020-10-24 18:23:28 +08:00
System.out.println("After sort : ");
print(arr);
}
}