Quick Sort 2
$ dart 06_sorting/quick_sort2.dart
import 'dart:io';
import 'dart:math';
class ArrayIns {
List<int> array;
int numberOfElements;
ArrayIns(int max) {
array = new List<int>(max);
numberOfElements = 0;
}
void insert(int value) {
array[numberOfElements] = value;
numberOfElements++;
}
void display() {
stdout.write('A = ');
for (int i = 0; i < numberOfElements; i++) {
stdout.write('${array[i]} ');
}
stdout.writeln();
}
void quickSort() {
recQuickSort(0, numberOfElements - 1);
}
void recQuickSort(int left, int right) {
int size = right - left + 1;
if (size <= 3) {
manualSort(left, right);
} else {
int median = medianOf3(left, right);
int partion = partionIt(left, right, median);
recQuickSort(left, partion - 1);
recQuickSort(partion + 1, right);
}
}
int medianOf3(int left, int right) {
int center = (left + right) ~/2;
if (array[left] > array[center]) {
swap(left, center);
}
if (array[left] > array[right]) {
swap(left, right);
}
if (array[center] > array[right]) {
swap(center, right);
}
swap(center, right - 1);
return array[right - 1];
}
int partionIt(int left, int right, int pivot) {
int leftPtr = left;
int rightPtr = right - 1;
while (true) {
while (array[++leftPtr] < pivot) {};
while (array[--rightPtr] > pivot) {};
if (leftPtr >= rightPtr) {
break;
} else {
swap(leftPtr, rightPtr);
}
}
swap(leftPtr, right - 1);
return leftPtr;
}
void manualSort(int left, int right) {
int size = right - left + 1;
if (size <= 1) {
return;
}
if (size == 2 ) {
if (array[left] > array[right]) {
swap(left, right);
}
return;
} else {
if (array[left] > array[right - 1]) {
swap(left, right - 1);
}
if (array[left] > array[right]) {
swap(left, right);
}
if (array[right - 1 ]> array[right]) {
swap(right - 1, right);
}
}
}
void swap(int dex1, int dex2) {
int temp;
temp = array[dex1];
array[dex1] = array[dex2];
array[dex2] = temp;
}
}
void main() {
int maxSize = 16;
Random random = new Random();
ArrayIns arrayIns = new ArrayIns(maxSize);
for (int i = 0; i < maxSize; i++) {
int value = random.nextInt(100);
arrayIns.insert(value);
}
arrayIns.display();
arrayIns.quickSort();
arrayIns.display();
}