hier 5 Weg, dies zu tun (man mehr hinzufügen):
als diese http://www.algolist.net/Algorithms/Sorting/Quicksort
sagte + Code mit einigen edit:
package AR;
class Node {
public int frequency;
public char value;
public Node(int frequency, char value) {
this.frequency = frequency;
this.value = value;
}
}
final class Sort {
int partition(Node arr[], int left, int right) {
int i = left, j = right;
Node tmp;
Node pivot = arr[(left + right)/2];
while (i <= j) {
while (i <= j && (arr[i].frequency < pivot.frequency || (arr[i].frequency == pivot.frequency && arr[i].value < pivot.value)))
i++;
while (i <= j && (arr[j].frequency > pivot.frequency || (arr[j].frequency == pivot.frequency && arr[j].value > pivot.value)))
j--;
if (i <= j) {
tmp = arr[i];
arr[i] = arr[j];
arr[j] = tmp;
i++;
j--;
}
}
return i;
}
public void quickSort(Node arr[], int left, int right) {
if (left > right) return;
int index = partition(arr, left, right);
if (left < index - 1)
quickSort(arr, left, index - 1);
if (index < right)
quickSort(arr, index, right);
}
}
final class Main {
public static void main(String[] args) {
Node[] ns = new Node[]{new Node(10, 'a'), new Node(10, 'c'), new Node(8, 'a'), new Node(1, 'b'), new Node(10, 'a'), new Node(10, 'b'), new Node(8, 'a'), new Node(1, 'b'), new Node(10, 'a'), new Node(10, 'b'), new Node(8, 'a'), new Node(1, 'b'), new Node(0, 'z'), new Node(1, 'z')};
int n = ns.length;
Sort cl = new Sort();
cl.quickSort(ns, 0, n - 1);
for (int i = 0; i < n; i++) {
System.out.print("(" + ns[i].frequency + "," + ns[i].value + "), ");
//(0,z), (1,b), (1,b), (1,b), (1,z), (8,a), (8,a), (8,a), (10,a), (10,a), (10,a), (10,b), (10,b), (10,c),
}
}
}
// in @ Debosmit Ray Art und Weise: (nur int T aus) unter Verwendung von Generics in Java ::
package AR;
class Node implements Comparable<Node> {
public int frequency;
public char value;
public Node(int frequency, char value) {
this.frequency = frequency;
this.value = value;
}
@Override
public int compareTo(Node o) {
if (this.frequency > o.frequency) return 1;
if (this.frequency < o.frequency) return -1;
if (this.value > o.value) return 1;
if (this.value < o.value) return -1;
return 0;
}
}
final class Sort<T extends Comparable<T>> {
int partition(T arr[], int left, int right) {
int i = left, j = right;
T tmp;
T pivot = arr[(left + right)/2];
while (i <= j) {
while (i <= j && arr[i].compareTo(pivot) < 0)
i++;
while (i <= j && arr[j].compareTo(pivot) > 0)
j--;
if (i <= j) {
tmp = arr[i];
arr[i] = arr[j];
arr[j] = tmp;
i++;
j--;
}
}
return i;
}
public void quickSort(T arr[], int left, int right) {
if (left > right) return;
int index = partition(arr, left, right);
if (left < index - 1)
quickSort(arr, left, index - 1);
if (index < right)
quickSort(arr, index, right);
}
}
final class Main {
public static void main(String[] args) {
Node[] ns = new Node[]{new Node(10, 'a'), new Node(10, 'c'), new Node(8, 'a'), new Node(1, 'b'), new Node(10, 'a'), new Node(10, 'b'), new Node(8, 'a'), new Node(1, 'b'), new Node(10, 'a'), new Node(10, 'b'), new Node(8, 'a'), new Node(1, 'b'), new Node(0, 'z'), new Node(1, 'z')};
int n = ns.length;
Sort cl = new Sort();
cl.quickSort(ns, 0, n - 1);
for (int i = 0; i < n; i++) {
System.out.print("(" + ns[i].frequency + "," + ns[i].value + "), ");
//(0,z), (1,b), (1,b), (1,b), (1,z), (8,a), (8,a), (8,a), (10,a), (10,a), (10,a), (10,b), (10,b), (10,c),
}
}
}
// Ort schwenken in der linken Seite des Arrays, ein d in einer Schleife, wie dies vergleichen:
package AR;
class Node {
public int frequency;
public char value;
public Node(int frequency, char value) {
this.frequency = frequency;
this.value = value;
}
}
final class Main {
static int partition(Node[] arr, int left, int right) {
int i = left+1, j = right;
Node tmp;
int pivot = left ;
while (i <= j) {
while (i <= j && (arr[i].frequency < arr[pivot].frequency || (arr[i].frequency == arr[pivot].frequency && arr[i].value <= arr[pivot].value)))
i++;
while (i <= j && (arr[j].frequency > arr[pivot].frequency || (arr[j].frequency == arr[pivot].frequency && arr[j].value > arr[pivot].value)))
j--;
if (i > j) break;
tmp = arr[i];
arr[i] = arr[j];
arr[j] = tmp;
}
tmp = arr[pivot];
arr[pivot] = arr[j];
arr[j] = tmp;
return j;
}
public static void quickSort(Node arr[], int left, int right) {
if (left >= right) return;
int i = partition(arr, left, right);
quickSort(arr, left, i - 1);
quickSort(arr, i + 1, right);
}
public static void main(String[] args) {
Node[] ns = new Node[]{new Node(10, 'a'), new Node(10, 'b'), new Node(8, 'a'), new Node(1, 'b'), new Node(10, 'a'), new Node(10, 'b'), new Node(0, 'z'), new Node(8, 'a'), new Node(1, 'b'), new Node(10, 'a'), new Node(10, 'b'), new Node(8, 'a'), new Node(1, 'b'), new Node(1, 'z')};
int n = ns.length;
quickSort(ns, 0, n - 1);
for (int i = 0; i < n; i++) {
System.out.print("(" + ns[i].frequency + "," + ns[i].value + "), ");
//(0,z), (1,b), (1,b), (1,b), (1,z), (8,a), (8,a), (8,a), (10,a), (10,a), (10,a), (10,b), (10,b), (10,b),
}
}
}
// @ Debosmit Ray Art und Weise sehr schön zu vergleichen ist, und es vereinfacht den Code:
package AR;
class Node implements Comparable<Node> {
public int frequency;
public char value;
public Node(int frequency, char value) {
this.frequency = frequency;
this.value = value;
}
@Override
public int compareTo(Node o) {
if (this.frequency > o.frequency) return 1;
if (this.frequency < o.frequency) return -1;
if (this.value > o.value) return 1;
if (this.value < o.value) return -1;
return 0;
}
}
final class Main {
static void swap(Node[] arr, int i, int j) {
Node temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
static int partition(Node[] arr, int left, int right) {
int i = left;
Node pivot = arr[left++];
while (left <= right) {
while (left <= right && arr[left].compareTo(pivot) <= 0) left++;
while (left <= right && arr[right].compareTo(pivot) > 0) right--;
if (left > right)break;
swap(arr, left++, right--);
}
swap(arr, i, right);
return right;
}
public static void quickSort(Node arr[], int left, int right) {
if (left >= right) return;
int i = partition(arr, left, right);
quickSort(arr, left, i - 1);
quickSort(arr, i + 1, right);
}
public static void main(String[] args) {
Node[] ns = new Node[]{new Node(10, 'a'), new Node(10, 'b'), new Node(8, 'a'), new Node(1, 'b'), new Node(10, 'a'), new Node(10, 'b'), new Node(8, 'a'), new Node(1, 'b'), new Node(10, 'a'), new Node(10, 'b'), new Node(8, 'a'), new Node(1, 'b'), new Node(0, 'z'), new Node(1, 'z')};
int n = ns.length;
quickSort(ns, 0, n - 1);
for (int i = 0; i < n; i++) {
System.out.print("(" + ns[i].frequency + "," + ns[i].value + "), ");
//(0,z), (1,b), (1,b), (1,b), (1,z), (8,a), (8,a), (8,a), (10,a), (10,a), (10,a), (10,b), (10,b), (10,b),
}
}
}
// Verwendung von Generics in Java:
package AR;
class Node implements Comparable<Node> {
public int frequency;
public char value;
public Node(int frequency, char value) {
this.frequency = frequency;
this.value = value;
}
@Override
public int compareTo(Node o) {
if (this.frequency > o.frequency) return 1;
if (this.frequency < o.frequency) return -1;
if (this.value > o.value) return 1;
if (this.value < o.value) return -1;
return 0;
}
}
final class Sort<T extends Comparable<T>> {
void swap(T[] arr, int i, int j) {
T temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
int partition(T[] arr, int left, int right) {
int i = left;
T pivot = arr[left++];
while (left <= right) {
while (left <= right && arr[left].compareTo(pivot) <= 0) left++;
while (left <= right && arr[right].compareTo(pivot) > 0) right--;
if (left > right) break;
swap(arr, left++, right--);
}
swap(arr, i, right);
return right;
}
public void quickSort(T arr[], int left, int right) {
if (left >= right) return;
int i = partition(arr, left, right);
quickSort(arr, left, i - 1);
quickSort(arr, i + 1, right);
}
}
final class Main {
public static void main(String[] args) {
Node[] ns = new Node[]{new Node(10, 'a'), new Node(10, 'c'), new Node(8, 'a'), new Node(1, 'b'), new Node(10, 'a'), new Node(10, 'b'), new Node(8, 'a'), new Node(1, 'b'), new Node(10, 'a'), new Node(10, 'b'), new Node(8, 'a'), new Node(1, 'b'), new Node(0, 'z'), new Node(1, 'z')};
int n = ns.length;
Sort cl = new Sort();
cl.quickSort(ns, 0, n - 1);
for (int i = 0; i < n; i++) {
System.out.print("(" + ns[i].frequency + "," + ns[i].value + "), ");
//(0,z), (1,b), (1,b), (1,b), (1,z), (8,a), (8,a), (8,a), (10,a), (10,a), (10,a), (10,b), (10,b), (10,c),
}
}
}
Gibt es einen Grund, das eingebaute 'Arrays.sort' nicht zu benutzen? – Mureinik
Nur eine Idee, wäre es nicht einfacher, ['Comparable'] (https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html) auf 'Node' zu implementieren und verwenden Sie 'compareTo' in der Sortierung und müssen Sie den Sortiercode nicht komplizierter machen, wenn Sie herausfinden wollen, wie man Knoten vergleicht? Dies würde auch die Verwendung vorhandener eingebauter Arten ermöglichen, es sei denn, es gibt einen sehr guten Grund, Ihre eigenen zu implementieren. –
Sind die eingebauten Sorten genauso schnell? Ich bin unter einem bisschen Zeit Crunch – KingDan