Merge Sort
$ dart 05_recursion/merge_sort.dart
import 'dart:io';
class Array {
List<int> array;
int numberOfElements;
Array(int max) {
array = new List<int>(max);
numberOfElements = 0;
}
void insert(int value) {
array[numberOfElements] = value;
numberOfElements ++;
}
void display() {
for (int i = 0; i < numberOfElements; i ++) {
stdout.write('${array[i]} ');
}
stdout.writeln();
}
void mergeSort() {
List<int> workSpace = new List<int>(numberOfElements);
_recursiveMergeSort(workSpace, 0, numberOfElements - 1);
}
void _recursiveMergeSort(List<int> workSpace, int lowerBound, int upperBound) {
if (lowerBound == upperBound) {
return;
} else {
int mid = (lowerBound + upperBound) ~/ 2;
_recursiveMergeSort(workSpace, lowerBound, mid);
_recursiveMergeSort(workSpace, mid + 1, upperBound);
_merge(workSpace, lowerBound, mid + 1, upperBound);
}
}
void _merge(List<int> workSpace, int lowPtr, int highPtr, int upperBound) {
int i = 0;
int lowerBound = lowPtr;
int mid = highPtr - 1;
int n = upperBound - lowerBound + 1;
while (lowPtr <= mid && highPtr <= upperBound) {
if (array[lowPtr] < array[highPtr]) {
workSpace[i++] = array[lowPtr++];
} else {
workSpace[i++] = array[highPtr++];
}
}
while (lowPtr <= mid) {
workSpace[i++] = array[lowPtr++];
}
while (highPtr <= upperBound) {
workSpace[i++] = array[highPtr++];
}
for (i=0; i < n; i ++) {
array[lowerBound + i] = workSpace[i];
}
}
}
void main() {
int maxSize = 100;
Array array = new Array(maxSize);
array.insert(64);
array.insert(21);
array.insert(33);
array.insert(70);
array.insert(12);
array.insert(85);
array.insert(44);
array.insert(3);
array.insert(99);
array.insert(0);
array.insert(108);
array.insert(36);
array.display();
array.mergeSort();
array.display();
}