Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdlib.h>
- #include <stdio.h>
- union Int32** dissort(int *count, int n, int a, int (*q)(int i), union Int32* (*p)(int i)) {
- int i = 0;
- while(i <= a) {
- count[i] = 0;
- i++;
- }
- i = 0;
- while (i < n) {
- count[(*q)(i)]++;
- i++;
- }
- i = 0;
- while (i < a) {
- count[i + 1] += count[i];
- i++;
- }
- union Int32 **d;
- d = (union Int32**)malloc(n * sizeof(union Int32*));
- int j = n - 1;
- while (j >= 0) {
- int k = (*q)(j);
- i = --count[k];
- d[i] = (*p)(j);
- j--;
- }
- return d;
- }
- union Int32 {
- int x;
- unsigned char bytes[4];
- };
- union Int32 **a;
- int b0(int i) {
- return a[i]->bytes[0];
- }
- int b1(int i) {
- return a[i]->bytes[1];
- }
- int b2(int i) {
- return a[i]->bytes[2];
- }
- int b3(int i) {
- return a[i]->bytes[3] ^ (1 << 7);
- }
- union Int32* p(int i) {
- return a[i];
- }
- int main() {
- int n, *countb0, *countb1, *countb2, *countb3;
- countb0 = (int*)malloc(256 * sizeof(int));
- countb1 = (int*)malloc(256 * sizeof(int));
- countb2 = (int*)malloc(256 * sizeof(int));
- countb3 = (int*)malloc(256 * sizeof(int));
- scanf("%d", &n);
- a = malloc(n * sizeof(union Int32*));
- for (int i = 0; i < n; i++) {
- a[i] = malloc(sizeof(union Int32));
- scanf("%d", &a[i]->x);
- }
- union Int32** db0 = dissort(countb0, n, 255, *b0, *p);
- free(a);
- free(countb0);
- a = db0;
- union Int32** db1 = dissort(countb1, n, 255, *b1, *p);
- free(a);
- free(countb1);
- a = db1;
- union Int32** db2 = dissort(countb2, n, 255, *b2, *p);
- free(a);
- free(countb2);
- a = db2;
- union Int32** db3 = dissort(countb3, n, 255, *b3, *p);
- free(a);
- free(countb3);
- a = db3;
- for (int i = 0; i < n; i++) {
- printf("%d ", a[i]->x);
- free(a[i]);
- }
- free(a);
- return 0;
- }
- ____________________________________________________________________________________________________________________________
- Поразрядная сортировка целых чисел
- Составьте программу radixsort.c, осуществляющую сортировку последовательности 32-разрядных целых чисел по возрастанию. В программе должен быть реализован алгоритм поразрядной сортировки.
- Программа должна считывать из стандартного потока ввода размер и элементы последовательности, и записывать в стандартный поток вывода элементы отсортированной последовательности.
- Например, если на вход программы подано
- 5
- 1000 700 -5000 2038 0
- то программа должна выводить в стандартный поток вывода
- -5000 0 700 1000 2038
- В программе сортируемая последовательность должна быть представлена в виде массива объединений Int32:
- union Int32 {
- int x;
- unsigned char bytes[4];
- };
- Тем самым подразумевается, что целые числа представлены в системе счисления по основанию 256. Доступ к отдельным байтам целого числа должен осуществляться через поле bytes объединения.
- Замечание.
- Следует помнить, что байты, из которых состоит целое число, расположены в памяти в обратном порядке (little-endian). Кроме того, числа представлены в дополнительном коде, поэтому сортировка по старшему байту, в котором находится знаковый бит, оличается от сортировки по другим разрядам числа.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement