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