Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <fstream>
- #include <vector>
- using namespace std;
- struct radixSortedNumber {
- unsigned int source_number;
- unsigned int sorted_number;
- radixSortedNumber(int number) : source_number(number), sorted_number(number) {
- }
- unsigned int nextDigit() {
- auto digit = sorted_number % 10;
- sorted_number /= 10;
- return (digit > 0 ? digit : (-1) * digit);
- }
- };
- typedef vector<radixSortedNumber> Block;
- typedef vector<Block> Blockset;
- void radix_sort(vector<unsigned int>& numbers) {
- Blockset current_blocks(10), next_blocks(10);
- size_t numbersSize = numbers.size();
- for (auto source : numbers) {
- radixSortedNumber number(source);
- auto position = number.nextDigit();
- current_blocks[position].push_back(number);
- }
- do {
- for (auto block : current_blocks) {
- for (auto number : block) {
- auto position = number.nextDigit();
- next_blocks[position].push_back(number);
- }
- }
- swap(current_blocks, next_blocks);
- for (auto& blockRef : next_blocks) {
- blockRef.clear();
- }
- } while (current_blocks[0].size() != numbersSize);
- int position = 0;
- for (auto number : current_blocks[0]) {
- numbers[position++] = number.source_number;
- }
- }
- int main(int argc, char* argv[]) {
- int count;
- ifstream in("radix_input.txt");
- ofstream out("radix_output.txt");
- in >> count;
- vector<unsigned int> numbers(count);
- for (int pos = 0; pos < count; ++pos) {
- in >> numbers[pos];
- }
- radix_sort(numbers);
- for (int pos = 0; pos < count; ++pos) {
- out << numbers[pos] << " ";
- }
- out << endl;
- in.close();
- out.close();
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement