Partion
Partion
Partitioning is the underlying mechanism of quicksort, which we’ll explore next, but it’s also a useful operation on its own.
To partition data is to divide it into two groups, so that all the items with a key value higher than a specified amount are in one group, and all the items with a lower key value are in another.
$ dart 06_sorting/partion.dart
import 'dart:io';
import 'dart:math';
class ArrayPart {
List<int> array;
int nElems;
ArrayPart(int max) {
array = new List<int>(max);
nElems = 0;
}
void insert(int value) {
array[nElems] = value;
nElems++;
}
int size() {
return nElems;
}
void display() {
stdout.write('A = ');
for (int i = 0; i < nElems; i++) {
stdout.write('${array[i]} ');
}
stdout.writeln();
}
int partion(int left, int right, int pivot) {
int leftPtr = left - 1;
int rightPtr = right + 1;
while (true) {
while (leftPtr < right && array[++leftPtr] < pivot) {};
while (rightPtr > left && array[--rightPtr] > pivot) {};
if (leftPtr >= rightPtr) {
break;
} else {
swap(leftPtr, rightPtr);
}
}
return leftPtr;
}
void swap(int dex1, int dex2) {
int temp;
temp = array[dex1];
array[dex1] = array[dex2];
array[dex2] = temp;
}
}
void main() {
int maxSize = 16;
ArrayPart arrayPart = new ArrayPart(maxSize);
Random random = new Random();
for (int i = 0; i < maxSize; i++) {
int n = random.nextInt(200);
arrayPart.insert(n);
}
arrayPart.display();
int pivot = 99;
stdout.write('Pivot is $pivot');
int size = arrayPart.size();
int partDex = arrayPart.partion(0, size - 1, pivot);
stdout.writeln(', Partion is at index $partDex');
arrayPart.display();
}