Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.72/29: Рейтинг темы: голосов - 29, средняя оценка - 4.72
4 / 4 / 1
Регистрация: 22.10.2012
Сообщений: 47
1

Поразрядная сортировка массива

08.03.2013, 09:59. Показов 6019. Ответов 5
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Дан массив двоичных чисел, нужно отсортировать его с помощью поразрядной сортировки, начиная со старшего разряда, функция должна быть рекурсивной. Никак не могу записать разбиение массива на части (вначале делится пополам, потом на 4 части и т.д.). Помогите, пожалуйста, довести программу до ума. Вот наработки:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
#include <cstdlib>
#include <stdio.h>
#include <math.h>
#define L 16
 
int binary (int n)
{
    while (n>0)
    {
          if (n%10>1) return 0;
          n=n/10;
    } 
    return 1;
}
 
int binmass(int A[], int &N)
{
    while(1)
    {
    printf ("Print N (2-%d)\n", L);
    scanf ("%d", &N);
    if (N>1 && N<L)
    {
         break;
    }
    else
    {
        printf ("Incorrect value\n");
    }
    }
    int bit=0;
    while (1)
    {
          printf ("Enter max bit < 5\n");
          scanf ("%d", &bit);
          if (bit<5) break;
          else printf ("Incorrect value\n");
    }
    for (int i=0; i<N; i++)
    {
        while(1)
        {
                printf ("\nEnter %d element\n", i+1);
                scanf ("%d", &A[i]);
                if (binary(A[i]) && A[i]<pow(10,bit)) break;
                else printf ("Incorrect element\n");
        }
    }
    return bit;
}
 
 
 
void binsort (int A[], int N, int bit, int key) // собственно, сама сортировка
{
 if (bit<0) return;
 int i=0, j=key-1, a=0, b=j, c=0, count=0, count1=0, T=0;
 for (i=0; i<N; i++, count++)
 {
     if (count+1==key) {i=i+1+key; count=0; j=i-1+key*2;}
     else j=b;
     c=A[i]/pow(10,bit);
     if (c%10==1) 
     {
                  a=A[i];
                  for (count1=0; count1<key; count1++, j--)
                  {
                      c=A[j]/pow(10,bit);
                      if (c%10==0) {A[i]=A[j]; A[j]=a; T=1;}
                  }
     }
     
 }
 if (T==0) binsort (A, N, bit-1, key);
 else  binsort (A, N, bit-1, key/2);
}
 
int main()
{
    int A[L], N=0, i=0;
    int bit=binmass (A, N);
    binsort (A, N, bit-1, N/2);
    printf ("Result\n");
    for (i=0; i<N; i++)
    {
        printf ("%d\n", A[i]);
    }
    system("PAUSE");
    return EXIT_SUCCESS;
}
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
08.03.2013, 09:59
Ответы с готовыми решениями:

Поразрядная сортировка
Необходимо реализовать метод поразрядной сортировки. Нужно отсортировать последовательность так, что бы она была отсортирована в порядке...

Поразрядная сортировка
Помогите решить проблему с кодом #include &quot;stdafx.h&quot; #include &lt;stdlib.h&gt; #include &lt;stdio.h&gt; #include &lt;string.h&gt; #include...

Поразрядная сортировка
Подскажите пожалуйста почему если ввести больше 100 элементов то код не работает? #include &quot;stdafx.h&quot; ...

5
Модератор
Эксперт по электронике
8958 / 6724 / 921
Регистрация: 14.02.2011
Сообщений: 23,733
08.03.2013, 10:21 2
Цитата Сообщение от TonyPride Посмотреть сообщение
int binary (int n)
что сия функция делает?
0
4 / 4 / 1
Регистрация: 22.10.2012
Сообщений: 47
08.03.2013, 12:42  [ТС] 3
Цитата Сообщение от ValeryS Посмотреть сообщение
что сия функция делает?
Проверяет, является ли число, в моём случае элемент массива, двоичным.

Добавлено через 2 часа 17 минут
Забыл сказать, порядок должен быть именно таким как в функции, т.е. из верхней половины выбирается элемент с единицей в старшем разряде, из нижней - с 0, они меняются, и так, пока не получится последовательность по возрастанию с 0, а затем с 1 в старшем разряде, затем верхняя и нижняя часть тоже дробятся пополам, в каждой из полученных частей функция повторяется (вот, собственно и вся рекурсия). Нигде в сети не нашёл подобной задачи или реализации алгоритма, уже всю голову сломал с тем как правильно поделить массив, да и вообще как это всё реализовать. Помогите добить задачу, сроки уже поджимают(
0
Неэпический
 Аватар для Croessmah
18124 / 10709 / 2063
Регистрация: 27.09.2012
Сообщений: 26,998
Записей в блоге: 1
08.03.2013, 12:44 4
Цитата Сообщение от TonyPride Посмотреть сообщение
Проверяет, является ли число, в моём случае элемент массива, двоичным.
Гениально
А теперь возьмите и еще раз посмотрите внимательнее
0
4 / 4 / 1
Регистрация: 22.10.2012
Сообщений: 47
09.03.2013, 04:32  [ТС] 5
Цитата Сообщение от Croessmah Посмотреть сообщение
А теперь возьмите и еще раз посмотрите внимательнее
Увидел, спасибо.

Добавлено через 15 часов 42 минуты
Подправил программу, функция работает верно не со всеми данными. Если ввести 1111, 1001, 1000, 1101, то числа будут рассортированы верно, если ввести 1101, 1111, 1000, 1011, то - нет. Если поменять параметры в 2-х строках (указал комментариями), то будет наоборот: вторая комбинация сортируется верно, первая - нет. Подскажите, пожалуйста, как это исправить.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
#include <cstdlib>
#include <stdio.h>
#include <math.h>
#define L 16 
 
int binary (int n)
{
    int a=n;
    while (a>0)
    {
          if (a%10>1) return 0;
          a=a/10;
    } 
    return 1;
}
 
 
void binsort (int A[], int N, int bit, int c1, int c2) // нужная функция
{                                                                  
     if (bit<0) return;                                
     int i=0, j=0, a=0, b=0, count=0;
     for (i=c1; i<(c2+c1)/2; i++)                      
     {
         b=A[i]/pow(10,bit);                           
         if(b%10==1)
         {
                    a=A[i];
                    for (j=c2-1; j>=(c2+c1)/2; j--)   
                    {
                        b=A[j]/pow(10,bit);
                        if (b%10==0) {count++; A[i]=A[j]; A[j]=a;} 
                    }
         }
     }
     if (count>0)                                                
     {
                 binsort (A, N, bit-1, c1, c1+count+1);       // если в этой и следующей строке убрать +1 из параметра 
                 binsort (A, N, bit-1, c1+count+1, c2);       // c1+count+1, то программа будет работать по другому,      
     }                                                                    // писал об этом в сообщении      
     else {binsort (A, N, bit-1, c1, c2);}                       
}
 
int main()
{
    int A[L], N=0, i=0;
    while(1)
    {
    printf ("Print N (2-%d)\n", L);
    scanf ("%d", &N);
    if (N>1 && N<L)
    {
         break;
    }
    else
    {
        printf ("Incorrect value\n");
    }
    }
    int bit=0;
    while (1)
    {
          printf ("Enter max bit < 5\n");
          scanf ("%d", &bit);
          if (bit<5) break;
          else printf ("Incorrect value\n");
    }
    for (int i=0; i<N; i++)
    {
        while(1)
        {
                printf ("\nEnter %d element\n", i+1);
                scanf ("%d", &A[i]);
                if (binary(A[i])==1 && A[i]<pow(10,bit)) break;
                else printf ("Incorrect element\n");
        }
    }
    binsort (A, N, bit-1, 0, N);                                 
    printf ("Result\n");
    for (i=0; i<N; i++)
    {
        printf ("%d\n", A[i]);
    }
    system("PAUSE");
    return EXIT_SUCCESS;
}
0
4 / 4 / 1
Регистрация: 22.10.2012
Сообщений: 47
11.03.2013, 13:44  [ТС] 6
Почти доделал программу, похоже что ошибка в цикле for с переменной i, но никак не могу понять где. Ввожу 1111, 1001, 1000, 1101 - всё верно. Ввожу 1001, 1111, 1000, 1101 либо 1101, 1111, 1000, 1011 - второй элемент (точнее i=1) не просматривается в цикле и он остаётся как есть. Ввёл несколько проверок с printf, но всё равно не могу никак понять, где я ошибку допустил. Подскажите, пожалуйста, что не так?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
#include <cstdlib>
#include <stdio.h>
#include <math.h>
#define L 16 
 
int binary (int n)
{
    int a=n;
    while (a>0)
    {
          if (a%10>1) return 0;
          a=a/10;
    } 
    return 1;
}
 
 
void binsort (int A[], int N, int bit, int c1, int c2) 
{                                                                  
     if (bit<0) return;                                
     int i=0, j=0, a=0, b=0, count=0;
     printf ("bit = %d\n", bit);
     for (i=c1; i<(c2+c1)/2; i++)                      
     {
         b=A[i]/pow(10,bit);                           
         if(b%10==1)
         {
                    a=A[i];
                    for (j=c2-1; j>=(c2+c1)/2; j--)   
                    {
                        b=A[j]/pow(10,bit);
                        if (b%10==0 && A[i]/pow(10,bit+1)>=A[j]/pow(10,bit+1)) {count++; A[i]=A[j]; A[j]=a; printf ("CHANGE %d and %d\n", i, j);} 
                    }
         }
     }
     if (count>0)                                                
     {
                 binsort (A, N, bit-1, c1, c1+count+1);           
                 binsort (A, N, bit-1, c1+count+1, c2);           
     }                                                            
     else {printf ("NEXT\n"); binsort (A, N, bit-1, c1, c2);}                       
}
 
int main()
{
    int A[L], N=0, i=0;
    while(1)
    {
    printf ("Print N (2-%d)\n", L);
    scanf ("%d", &N);
    if (N>1 && N<L)
    {
         break;
    }
    else
    {
        printf ("Incorrect value\n");
    }
    }
    int bit=0; // êîëè÷åñòâî öèôð â ÷èñëå
    while (1)
    {
          printf ("Enter max bit < 5\n");
          scanf ("%d", &bit);
          if (bit<5) break;
          else printf ("Incorrect value\n");
    }
    for (int i=0; i<N; i++)
    {
        while(1)
        {
                printf ("\nEnter %d element\n", i+1);
                scanf ("%d", &A[i]);
                if (binary(A[i])==1 && A[i]<pow(10,bit)) break;
                else printf ("Incorrect element\n");
        }
    }
    binsort (A, N, bit-1, 0, N);                                 
    printf ("Result\n");
    for (i=0; i<N; i++)
    {
        printf ("%d\n", A[i]);
    }
    system("PAUSE");
    return EXIT_SUCCESS;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
11.03.2013, 13:44
Помогаю со студенческими работами здесь

Поразрядная сортировка
*Задача* Программа запрашивает число, пользователь вводит , например 10000 , тогда программа генерирует 10000 случайных чисел от 0 до...

Поразрядная сортировка
Программа вылетает, не пойму почему? подскажите пожалуйста. #include &quot;iostream&quot; using namespace std; int n, col_razr=0; int...

Поразрядная сортировка MSD
Поразрядная сортировка MSD , есть???

Поразрядная цифровая сортировка
Не пойму, как правильно исправить ошибки (С++ учу недавно, толком не разобралась) Подскажите, пожалуйста Срочно! #include...

Цифровая/поразрядная сортировка
Привет, знаний не хватает и времени тоже. прощу помощи Нужно в c++ реализовать цифровую сортировку, задавая рандом числа(большие, до...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему

Редактор формул (кликните на картинку в правом углу, чтобы закрыть)
Новые блоги и статьи
Лучшие практики оптимизации Docker Image
Mr. Docker 13.03.2025
Размер Docker-образа влияет на множество аспектов работы с контейнерами. Чем больше образ, тем дольше его загрузка в реестр и выгрузка из него. Для команд разработки, работающих с CI/ CD пайплайнами,. . .
Вопросы на собеседовании по Docker
Mr. Docker 13.03.2025
Ты сидишь напротив технического специалиста, и вдруг звучит вопрос про Docker Swarm или многоэтапные сборки. Пот на лбу? Не переживай, после этой статьи ты будешь готов ко всему! Эта статья будет. . .
Поиск текста в сносках : замена дефиса на тире или тире на дефис...
РоΜа 13.03.2025
Нужно было найти текст в сносках и заменить. Почему-то метод селекшн не сработал. . . пришлось гуглить. найденный на форумвба код пришлось править. Смысл - заменяет в сносках дефисы и тире на нужные. . . .
Real PATH definitions in bash scripts
jigi33 13.03.2025
Как поймать путь и путь к директории относительно запускаемого файла в BASH 1. поймать путь через вывод $(pwd) 2. более правильно - на основе realpath (см. скриншот)
Django или Flask: что выбрать для веб-разработки на Python
py-thonny 13.03.2025
Django – это высокоуровневый фреймворк, который придерживается философии "всё включено". Он предоставляет разработчику готовые решения для большинства типичных задач веб-разработки: от аутентификации. . .
Непрерывное развертывание в Java с Kubernetes
Javaican 13.03.2025
Чем так привлекателен Kubernetes для развертывания Java-приложений? Этот оркестратор контейнеров позволяет автоматизировать развертывание, масштабирование и управление контейнеризированными. . .
Предотвращение XSS, CSRF и SQL-инъекций в JavaScript
run.dev 13.03.2025
JavaScript занимает первые позиции среди языков веб-разработки, но его распространенность делает его привлекательной целью для злоумышленников. Межсайтовый скриптинг (XSS), межсайтовая подделка. . .
PHP 8: JIT-компиляция и улучшение производительно­сти
Jason-Webb 13.03.2025
PHP никогда не славился своей скоростью. Многие сталкивались с проблемами производительности при работе со сложными вычислениями или обработкой больших объемов данных. Традиционная модель выполнения. . .
Сериализация данных с Apache Avro в Kafka
Javaican 12.03.2025
Apache Kafka стала одним из ключевых решений для работы с большими потоками данных. Однако с ростом объемов передаваемых данных возникает проблема: как эффективно сериализовать и десериализовать. . .
Создание потребителей Kafka с помощью Reactor Kafka
Javaican 12.03.2025
Reactor Kafka — это библиотека, объединяющая Apache Kafka с реактивным программированием на базе Project Reactor. Такое сочетание позволяет строить неблокирующие, асинхронные приложения с контролем. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru