Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.78
TonyPride
2 / 2 / 1
Регистрация: 22.10.2012
Сообщений: 47
#1

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

08.03.2013, 09:59. Просмотров 1360. Ответов 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;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.03.2013, 09:59     Поразрядная сортировка массива
Посмотрите здесь:

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

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

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

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

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

Обменная поразрядная сортировка масива - C++
Помогите пожалуйста исправить код, у меня сортируется массив только по старшему биту как сделать что бы сортировалось по остальным битам...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ValeryS
Модератор
6550 / 5016 / 463
Регистрация: 14.02.2011
Сообщений: 16,729
08.03.2013, 10:21     Поразрядная сортировка массива #2
Цитата Сообщение от TonyPride Посмотреть сообщение
int binary (int n)
что сия функция делает?
TonyPride
2 / 2 / 1
Регистрация: 22.10.2012
Сообщений: 47
08.03.2013, 12:42  [ТС]     Поразрядная сортировка массива #3
Цитата Сообщение от ValeryS Посмотреть сообщение
что сия функция делает?
Проверяет, является ли число, в моём случае элемент массива, двоичным.

Добавлено через 2 часа 17 минут
Забыл сказать, порядок должен быть именно таким как в функции, т.е. из верхней половины выбирается элемент с единицей в старшем разряде, из нижней - с 0, они меняются, и так, пока не получится последовательность по возрастанию с 0, а затем с 1 в старшем разряде, затем верхняя и нижняя часть тоже дробятся пополам, в каждой из полученных частей функция повторяется (вот, собственно и вся рекурсия). Нигде в сети не нашёл подобной задачи или реализации алгоритма, уже всю голову сломал с тем как правильно поделить массив, да и вообще как это всё реализовать. Помогите добить задачу, сроки уже поджимают(
Croessmah
Модератор
Эксперт CЭксперт С++
13051 / 7314 / 814
Регистрация: 27.09.2012
Сообщений: 18,051
Записей в блоге: 3
Завершенные тесты: 1
08.03.2013, 12:44     Поразрядная сортировка массива #4
Цитата Сообщение от TonyPride Посмотреть сообщение
Проверяет, является ли число, в моём случае элемент массива, двоичным.
Гениально
А теперь возьмите и еще раз посмотрите внимательнее
TonyPride
2 / 2 / 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;
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.03.2013, 13:44     Поразрядная сортировка массива
Еще ссылки по теме:

Поразрядная сортировка и его недостатки - C++
Собствено сабж в &quot;плохости&quot; поразрядной сортировки. Ведь, если она отрабатывает за линейное время и не требует спец. аппаратной поддержки,...

Трехпутевая поразрядная быстрая сортировка - C++
нужна помощь с написанием програмки на тему: Трехпутевая поразрядная быстрая сортировка заранее спасибо

Поразрядная сортировка символьных массивов - C++
Всем привет! Кто нибудь может показать пример кода, для поразрядной сортировки символьных массивов, с числовыми массивами разобрался, а с ...

Поразрядная операция & - C++
Здравствуйте! У меня есть программа: unsigned short int con(unsigned short int x, unsigned short int y, unsigned short int z); ...

Поразрядная конъюнкция / Дизъюнкция / Исключающие, (&), (|), (^) - C++
... cout &lt;&lt; &quot;\n 6 &amp; 5 = &quot; &lt;&lt; (6 &amp; 5); cout &lt;&lt; &quot;\n 6 | 5 = &quot; &lt;&lt; (6 | 5); cout &lt;&lt; &quot;\n 6 ^ 5 = &quot; &lt;&lt; (6 ^ 5); ... ...

Сортировка массива - C++
В общем програ работает без выделении памяти нормально, но как только я добавил туда указатель на массив, после компиляции и запуска ее она...


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

Или воспользуйтесь поиском по форуму:
TonyPride
2 / 2 / 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;
}
Yandex
Объявления
11.03.2013, 13:44     Поразрядная сортировка массива
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru