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

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

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

Студворк — интернет-сервис помощи студентам
Дан массив двоичных чисел, нужно отсортировать его с помощью поразрядной сортировки, начиная со старшего разряда, функция должна быть рекурсивной. Никак не могу записать разбиение массива на части (вначале делится пополам, потом на 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
Модератор
Эксперт по электронике
8981 / 6748 / 921
Регистрация: 14.02.2011
Сообщений: 23,870
08.03.2013, 10:21
Цитата Сообщение от TonyPride Посмотреть сообщение
int binary (int n)
что сия функция делает?
0
4 / 4 / 1
Регистрация: 22.10.2012
Сообщений: 47
08.03.2013, 12:42  [ТС]
Цитата Сообщение от ValeryS Посмотреть сообщение
что сия функция делает?
Проверяет, является ли число, в моём случае элемент массива, двоичным.

Добавлено через 2 часа 17 минут
Забыл сказать, порядок должен быть именно таким как в функции, т.е. из верхней половины выбирается элемент с единицей в старшем разряде, из нижней - с 0, они меняются, и так, пока не получится последовательность по возрастанию с 0, а затем с 1 в старшем разряде, затем верхняя и нижняя часть тоже дробятся пополам, в каждой из полученных частей функция повторяется (вот, собственно и вся рекурсия). Нигде в сети не нашёл подобной задачи или реализации алгоритма, уже всю голову сломал с тем как правильно поделить массив, да и вообще как это всё реализовать. Помогите добить задачу, сроки уже поджимают(
0
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,035
Записей в блоге: 1
08.03.2013, 12:44
Цитата Сообщение от TonyPride Посмотреть сообщение
Проверяет, является ли число, в моём случае элемент массива, двоичным.
Гениально
А теперь возьмите и еще раз посмотрите внимательнее
0
4 / 4 / 1
Регистрация: 22.10.2012
Сообщений: 47
09.03.2013, 04:32  [ТС]
Цитата Сообщение от 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  [ТС]
Почти доделал программу, похоже что ошибка в цикле 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
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru