У меня это работает, однако последний метод Array, Sorted C Method выводит это:
SORTED C METHOD: 179, 181, 238, 190, 105, 144, 26, 63, 90, 14, SORTED C METHOD: 190, 238, 181, 179, 105, 144, 26, 63, 90, 14, SORTED C METHOD: 238, 190, 181, 179, 105, 144, 26, 63, 90, 14,
Почему повторяется так много раз, когда метод Sorted A и метод B отсортированы только один раз?
Ниже приведен код:
Основной класс:
import java.util.ArrayList;
import java.util.Random;
public class main {
public static void main(String[] args) {
ThreeSorts.SortA(randArray(0));
System.out.println("\n");
ThreeSorts.SortB(randArray(0));
System.out.println("\n");
ThreeSorts.SortC(randArray(0));
System.out.println("\n");
}
public static ArrayList<Integer> randArray(int n) {
ArrayList<Integer> a = new ArrayList<Integer>(n);
Random rand = new Random();
rand.setSeed(System.currentTimeMillis());
int[] x = new int[10];
for (int i = 0; i < x.length; i++) {
Integer r = Math.abs(rand.nextInt() % 256);
a.add(r);
}
showArray(a);
return a;
}
public static void showArray(ArrayList<Integer> a) {
int n = a.size();
System.out.println("RANDOM NUMBERS GENERATED 0 TO 255:");
for (int i = 0; i < n; i++) {
int r = a.get(i);
System.out.print("|" + r + "| ");
}
System.out.println("\n");
}
public static void showA(ArrayList<Integer> array) {
int n = array.size();
System.out.print("SORTED A METHOD: ");
for (int i = 0; i < n; i++) {
int r = array.get(i);
System.out.print(r + ", ");
}
}
public static void showB(ArrayList<Integer> array) {
int n = array.size();
System.out.print("SORTED B METHOD: ");
for (int i = 0; i < n; i++) {
int r = array.get(i);
System.out.print(r + ", ");
}
}
public static void showC(ArrayList<Integer> array) {
int n = array.size();
System.out.print("SORTED C METHOD: ");
for (int i = 0; i < n; i++) {
int r = array.get(i);
System.out.print(r + ", ");
}
}
}
Класс отсортированных массивов:
import java.util.*;
pubic class ThreeSorts {
private static ArrayList<Integer> CopyArray(ArrayList<Integer> a) {
ArrayList<Integer> resa = new ArrayList<Integer>(a.size());
for (int i = 0; i < a.size(); ++i) {
resa.add(a.get(i));
}
return (resa);
}
public static ArrayList<Integer> SortA(ArrayList<Integer> a) {
ArrayList<Integer> array = CopyArray(a);
int n = a.size(), i;
boolean noswaps = false;
while (noswaps == false) {
noswaps = true;
for (i = 0; i < n - 1; ++i) {
if (array.get(i) < array.get(i + 1)) {
Integer temp = array.get(i);
array.set(i, array.get(i + 1));
array.set(i + 1, temp);
noswaps = false;
}
}
}
main.showA(array);
return (array);
}
public static ArrayList<Integer> SortB(ArrayList<Integer> a) {
ArrayList<Integer> array = CopyArray(a);
Integer[] zero = new Integer[a.size()];
Integer[] one = new Integer[a.size()];
int i, b;
Integer x, p;
// Change from 8 to 32 for whole integers - will run 4 times slower
for (b = 0; b < 8; ++b) {
int zc = 0;
int oc = 0;
for (i = 0; i < array.size(); ++i) {
x = array.get(i);
p = 1 << b;
if ((x & p) == 0) {
zero[zc++] = array.get(i);
} else {
one[oc++] = array.get(i);
}
}
for (i = 0; i < oc; ++i)
array.set(i, one[i]);
for (i = 0; i < zc; ++i)
array.set(i + oc, zero[i]);
}
main.showB(array);
return (array);
}
public static ArrayList<Integer> SortC(ArrayList<Integer> a) {
ArrayList<Integer> array = CopyArray(a);
SortC(array, 0, array.size() - 1);
return (array);
}
public static void SortC(ArrayList<Integer> array, int first, int last) {
if (first < last) {
int pivot = PivotList(array, first, last);
SortC(array, first, pivot - 1);
SortC(array, pivot + 1, last);
}
}
private static void Swap(ArrayList<Integer> array, int a, int b) {
Integer temp = array.get(a);
array.set(a, array.get(b));
array.set(b, temp);
}
private static int PivotList(ArrayList<Integer> array, int first, int last) {
Integer PivotValue = array.get(first);
int PivotPoint = first;
for (int index = first + 1; index <= last; ++index) {
if (array.get(index) > PivotValue) {
PivotPoint = PivotPoint + 1;
Swap(array, PivotPoint, index);
}
}
main.showC(array);
Swap(array, first, PivotPoint);
return (PivotPoint);
}
}
P.S. Я использую Eclipse Java