Initial commit 10.2
parent
988047eca0
commit
fc0d86554b
@ -0,0 +1,53 @@
|
||||
package _10._2;
|
||||
|
||||
import provided._10._2.*;
|
||||
|
||||
public class QuickSortThreaded extends QuickSort implements Runnable {
|
||||
private int[] numbers;
|
||||
private int leftIndex;
|
||||
private int rightIndex;
|
||||
|
||||
public QuickSortThreaded() {
|
||||
}
|
||||
|
||||
public QuickSortThreaded(int[] numbers, int leftIndex, int rightIndex) {
|
||||
this.numbers = numbers;
|
||||
this.leftIndex = leftIndex;
|
||||
this.rightIndex = rightIndex;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void run() {
|
||||
quickSort(numbers, leftIndex, rightIndex);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* sortiert das uebergebene Array in aufsteigender Reihenfolge
|
||||
* gemaess dem QuickSort-Algorithmus (parallel!)
|
||||
*/
|
||||
public static void sort(int[] numbers) {
|
||||
new QuickSortThreaded().quickSort(numbers, 0, numbers.length - 1);
|
||||
}
|
||||
|
||||
/**
|
||||
* der Quicksort-Algorithmus wird auf dem Array zwischen den
|
||||
* angegebenen Indizes ausgefuehrt
|
||||
*/
|
||||
protected void quickSort(int[] numbers, int leftIndex, int rightIndex) {
|
||||
if (leftIndex < rightIndex) {
|
||||
int pivotIndex = divide(numbers, leftIndex, rightIndex);
|
||||
Thread threadLeft = new Thread(new QuickSortThreaded(numbers, leftIndex, pivotIndex - 1));
|
||||
Thread threadRight = new Thread(new QuickSortThreaded(numbers, pivotIndex + 1, rightIndex));
|
||||
threadLeft.start();
|
||||
threadRight.start();
|
||||
try {
|
||||
threadLeft.join(); // Wait for first thread.
|
||||
threadRight.join();
|
||||
} catch (InterruptedException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@ -0,0 +1,80 @@
|
||||
package provided._10._2;
|
||||
|
||||
public class QuickSort {
|
||||
|
||||
/**
|
||||
* sortiert das uebergebene Array in aufsteigender Reihenfolge
|
||||
* gemaess dem QuickSort-Algorithmus
|
||||
*/
|
||||
public static void sort(int[] numbers) {
|
||||
new QuickSort().quickSort(numbers, 0, numbers.length - 1);
|
||||
}
|
||||
|
||||
/**
|
||||
* der Quicksort-Algorithmus wird auf dem Array zwischen den
|
||||
* angegebenen Indizes ausgefuehrt
|
||||
*/
|
||||
protected void quickSort(int[] numbers, int leftIndex, int rightIndex) {
|
||||
if (leftIndex < rightIndex) {
|
||||
int pivotIndex = divide(numbers, leftIndex, rightIndex);
|
||||
quickSort(numbers, leftIndex, pivotIndex - 1);
|
||||
quickSort(numbers, pivotIndex + 1, rightIndex);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* liefert den Index des Pivot-Elementes und ordnet das Array innerhalb
|
||||
* der angegebenen Indizes so um, dass alle Zahlen links vom Index
|
||||
* kleiner oder gleich und alle Zahlen rechts vom Index groesser
|
||||
* oder gleich dem Pivot-Element sind
|
||||
*/
|
||||
protected int divide(int[] numbers, int leftIndex, int rightIndex) {
|
||||
int pivotIndex = choosePivotIndex(numbers, leftIndex, rightIndex);
|
||||
int pivotValue = numbers[pivotIndex];
|
||||
// das Pivot-Element kommt nach ganz rechts im Array
|
||||
swap(numbers, pivotIndex, rightIndex);
|
||||
int left = leftIndex - 1;
|
||||
int right = rightIndex;
|
||||
// ordne das Array so um, dass jeweils alle Elemente links vom
|
||||
// Zeiger left kleiner und alle Elemente rechts vom Zeiger right
|
||||
// groesser als das Pivot-Element sind
|
||||
do {
|
||||
left++;
|
||||
while (left <= rightIndex && numbers[left] <= pivotValue)
|
||||
left++;
|
||||
right--;
|
||||
while (right >= leftIndex && numbers[right] >= pivotValue)
|
||||
right--;
|
||||
if (left < right) {
|
||||
swap(numbers, left, right);
|
||||
}
|
||||
} while (left < right);
|
||||
// platziere das Pivot-Element an seine korrekte Position
|
||||
if (left < rightIndex) {
|
||||
swap(numbers, left, rightIndex);
|
||||
return left;
|
||||
} else {
|
||||
return rightIndex;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* waehlt einen beliebigen Index zwischen den angegebenen Indizes
|
||||
*/
|
||||
protected int choosePivotIndex(int[] numbers, int leftIndex, int rightIndex) {
|
||||
// in diesem Fall einfach der mittleren Index
|
||||
return (leftIndex + rightIndex) / 2;
|
||||
}
|
||||
|
||||
/**
|
||||
* tauscht die Elemente des Arrays an den angegebenen Indizes
|
||||
*/
|
||||
protected void swap(int[] numbers, int index1, int index2) {
|
||||
if (index1 != index2) {
|
||||
int tmp = numbers[index1];
|
||||
numbers[index1] = numbers[index2];
|
||||
numbers[index2] = tmp;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@ -0,0 +1,26 @@
|
||||
package provided._10._2;
|
||||
|
||||
import _10._2.QuickSortThreaded;
|
||||
|
||||
public class QuickSortTest {
|
||||
|
||||
public static void main(String[] args) {
|
||||
int[] numbers = {2, 3, 9, 33, -2, 4, 55, 66, -234};
|
||||
print(numbers);
|
||||
QuickSort.sort(numbers);
|
||||
print(numbers);
|
||||
|
||||
int[] numbers2 = {2, 3, 9, 33, -2, 4, 55, 66, -234};
|
||||
print(numbers2);
|
||||
QuickSortThreaded.sort(numbers2);
|
||||
print(numbers2);
|
||||
}
|
||||
|
||||
private static void print(int[] numbers) {
|
||||
for (int number : numbers) {
|
||||
System.out.print(number + " ");
|
||||
}
|
||||
System.out.println();
|
||||
}
|
||||
|
||||
}
|
||||
Loading…
Reference in New Issue