Advertisement
Guest User

Untitled

a guest
Jun 20th, 2024
72
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.27 KB | None | 0 0
  1. class Node {
  2. public:
  3.     long long data;
  4.     Node* next;
  5.     Node(long long data) : data(data), next(nullptr) {}
  6. };
  7.  
  8. void radix_sort_linked_list(std::vector<long long>& arr, long long size) {
  9.     Node** least_sig_digit = new Node*[size]();
  10.     Node** least_sig_digit_last = new Node*[size]();
  11.     for (long long num : arr) {
  12.         long long q = num / size;
  13.         long long r = num % size;
  14.         if (least_sig_digit[r] == nullptr) {
  15.             least_sig_digit[r] = new Node(q);
  16.             least_sig_digit_last[r] = least_sig_digit[r];
  17.         } else {
  18.             least_sig_digit_last[r]->next = new Node(q);
  19.             least_sig_digit_last[r] = least_sig_digit_last[r]->next;
  20.         }
  21.     }
  22.     Node** highest_sig_digit = new Node*[size]();
  23.     Node** highest_sig_digit_last = new Node*[size]();
  24.     for (long long k = 0; k < size; ++k) {
  25.         Node* current = least_sig_digit[k];
  26.         while (current != nullptr) {
  27.             long long q = current->data;
  28.             if (highest_sig_digit[q] == nullptr) {
  29.                 highest_sig_digit[q] = new Node(q * size + k);
  30.                 highest_sig_digit_last[q] = highest_sig_digit[q];
  31.             } else {
  32.                 highest_sig_digit_last[q]->next = new Node(q * size + k);
  33.                 highest_sig_digit_last[q] = highest_sig_digit_last[q]->next;
  34.             }
  35.             current = current->next;
  36.         }
  37.     }
  38.     long long i = 0;
  39.     for (long long k = 0; k < size; ++k) {
  40.         Node* current = highest_sig_digit[k];
  41.         while (current != nullptr) {
  42.             arr[i++] = current->data;
  43.             current = current->next;
  44.         }
  45.     }
  46.    
  47.     // Free memory
  48.     for (long long k = 0; k < size; ++k) {
  49.         Node* current = least_sig_digit[k];
  50.         while (current != nullptr) {
  51.             Node* temp = current;
  52.             current = current->next;
  53.             delete temp;
  54.         }
  55.     }
  56.     for (long long k = 0; k < size; ++k) {
  57.         Node *current = highest_sig_digit[k];
  58.         while (current != nullptr) {
  59.             Node *temp = current;
  60.             current = current->next;
  61.             delete temp;
  62.         }
  63.     }
  64.     delete[] least_sig_digit;
  65.     delete[] least_sig_digit_last;
  66.     delete[] highest_sig_digit;
  67.     delete[] highest_sig_digit_last;
  68. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement