|
| 1 | +import 'dart:math'; |
| 2 | + |
| 3 | +import '../models/item.dart'; |
| 4 | +import '../models/step.dart'; |
| 5 | +import '../utils.dart'; |
| 6 | + |
| 7 | +List<Step> radixSort(List<Item> input) { |
| 8 | + var result = <Step>[]; |
| 9 | + var largest = max(input); |
| 10 | + |
| 11 | + var step = Step(<Item>[], 'Starting Position'); |
| 12 | + |
| 13 | + for (var i = 0; i < input.length; i++) { |
| 14 | + step.list.add( |
| 15 | + Item( |
| 16 | + i, |
| 17 | + input[i].value, |
| 18 | + defaultColor, |
| 19 | + ), |
| 20 | + ); |
| 21 | + } |
| 22 | + |
| 23 | + result.add(Step(List<Item>.from(step.list), step.reason)); |
| 24 | + |
| 25 | + for (var e = 1; (largest / e).floor() > 0; e *= 10) { |
| 26 | + countSort( |
| 27 | + input, result, e, (largest / e).floor() % 10 == (largest / e).floor()); |
| 28 | + |
| 29 | + result.add(Step(List<Item>.from(input), |
| 30 | + 'Sorted according to significant digit no. ${logBase(e, 10) + 1}')); |
| 31 | + } |
| 32 | + |
| 33 | + result.add(Step(List<Item>.from(input), 'Sorted')); |
| 34 | + |
| 35 | + return result; |
| 36 | +} |
| 37 | + |
| 38 | +void countSort(List<Item> a, List<Step> result, int e, bool last) { |
| 39 | + var cnt = List<int>.filled(10, 0); |
| 40 | + var res = List<Item>.filled(a.length, Item(0, 0, defaultColor)); |
| 41 | + |
| 42 | + for (var i = 0; i < a.length; ++i) { |
| 43 | + cnt[(a[i].value / e).floor() % 10]++; |
| 44 | + } |
| 45 | + |
| 46 | + for (var i = 1; i < cnt.length; ++i) { |
| 47 | + cnt[i] += cnt[i - 1]; |
| 48 | + } |
| 49 | + |
| 50 | + for (var i = a.length - 1; i >= 0; --i) { |
| 51 | + res[cnt[(a[i].value / e).floor() % 10] - 1] = |
| 52 | + last ? a[i].copyWith(color: sortedColor) : a[i]; |
| 53 | + result.add(Step(List<Item>.from(res), |
| 54 | + 'put ${res[cnt[(a[i].value / e).floor() % 10] - 1]} in place')); |
| 55 | + |
| 56 | + cnt[(a[i].value / e).floor() % 10]--; |
| 57 | + } |
| 58 | + |
| 59 | + for (var i = 0; i < a.length; i++) { |
| 60 | + a[i] = res[i]; |
| 61 | + } |
| 62 | +} |
| 63 | + |
| 64 | +int max(List<Item> a) { |
| 65 | + var largest = -10e9.toInt(); |
| 66 | + for (var i in a) { |
| 67 | + if (i.value > largest) { |
| 68 | + largest = i.value; |
| 69 | + } |
| 70 | + } |
| 71 | + |
| 72 | + return largest; |
| 73 | +} |
| 74 | + |
| 75 | +double logBase(num x, num base) => log(x) / log(base); |
0 commit comments