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

Не получается составить блочную сортировку - C++

Восстановить пароль Регистрация
 
strange_man
 Аватар для strange_man
9 / 9 / 0
Регистрация: 17.05.2012
Сообщений: 117
17.11.2012, 18:39     Не получается составить блочную сортировку #1
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
#include <iostream>
#include <cstdlib>
#include <ctime>
 
using namespace std;
 
void bucketSort (int [], int);
 
int main()
{
    const int size = 10;
    int array1[size] = { 0 }; //одномерный массив, который будем сортировать
 
    srand(4);
 
    //заполняем массив
    for (int i = 0; i < size; i++)
    {
        array1[i] = 1 + rand() % 100;
        cout << array1[i] << " ";
    }
 
    cout << endl;
 
    bucketSort (array1, size); // функция, которая будет выполнять блочную сортировку
 
    //вывод отсотированного массива
    for (int i = 0; i < size; i++)
        cout << array1[i] << " " ;
 
    cout << endl;
 
    system("pause");
    return 0;
}
 
void bucketSort (int array1[], int n)
{
    int array2[10][10] = { 0 }; // создаем новый двумерный массив, для того чтобы сортировать по блокам
    int max = 0;
 
    // определяю максимальный элемент
    for (int i = 0; i < n; i++)
        if (array1[i] > max)
            max = array1[i];
 
    int m = 10; //делитель, нужен будет для работы с разрядами
 
    while (m <= max)
    {
        int array3[10] = { 0 }; //в этом массиве я собирался хранить количество элементов одинаковой разрядности, чтобы потом заполнить ими одну строку в двумерном массиве
 
        //дальше неправильно
        for (int i = 0; i < n; i++)
        {
            array2[array1[i] / m][array3[array1[i] / m]] = array1[i];
            ++array3[array1[i] / m];
        }
 
        for (int i = 0; i < n; i++)
            array1[i] = 0;
 
        //копирую значения в одномерный массив
        for (int i = 0; i < 10; i++)
            for (int j = 0; array2[i][j] != 0; j++)
                array1[i] = array2[i][j];
 
        m *= 10;
    }
}
Добавлено через 3 часа 53 минуты
Получилось.
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
#include <iostream>
#include <cstdlib>
#include <ctime>
 
using namespace std;
 
void bucketSort (int [], int);
 
int main()
{
    const int size = 10;
    int array1[size] = { 0 }; //одномерный массив, который будем сортировать
 
    srand(time(0));
 
    //заполняем массив
    for (int i = 0; i < size; i++)
    {
        array1[i] = 1 + rand() % 100;
        cout << array1[i] << " ";
    }
 
    cout << endl;
 
    bucketSort (array1, size); // функция, которая будет выполнять блочную сортировку
 
    //вывод отсотированного массива
    for (int i = 0; i < size; i++)
        cout << array1[i] << " " ;
 
    cout << endl;
 
    system("pause");
    return 0;
}
 
void bucketSort (int array1[], int n)
{
    int array2[10][10] = { 0 }; // создаем новый двумерный массив, для того чтобы сортировать по блокам
    int max = 0;
 
    // определяю максимальный элемент
    for (int i = 0; i < n; i++)
        if (array1[i] > max)
            max = array1[i];
 
    int m = 10; //делитель, нужен будет для работы с разрядами
 
    while (m / 10 <= max)
    {
        int array3[10] = { 0 }; //в этом массиве я собирался хранить количество элементов одинаковой разрядности, чтобы потом заполнить ими одну строку в двумерном массиве
        
        //обнуление массива блоков
        for (int i = 0; i < 10; i++)
            for (int j = 0; j < n; j++)
                array2[i][j] = 0;
 
        for (int i = 0; i < n; i++)
        {
            array2[(array1[i] % m) / (m / 10)][array3[(array1[i] % m) / (m / 10)]] = array1[i]; //вычисляет адрес клетки и присваевает ему соответствующее значение в неотсортированном массиве
            ++array3[(array1[i] % m) / (m / 10)]; // если в определенной строчке уже есть число, то нужно увеличить счетчик, чтобы в следующий раз число с такой же разряднстью стало на следующую ячейку
        }
 
        //обнуление одномерного массива
        for (int i = 0; i < n; i++)
            array1[i] = 0;
 
        int count = 0;
 
        //копирую значения в одномерный массив
        for (int i = 0; i < 10; i++)
            for (int j = 0; array2[i][j] != 0; j++)
            {
                array1[count] = array2[i][j];
                count++;
            }
 
        m *= 10;
    }
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.11.2012, 18:39     Не получается составить блочную сортировку
Посмотрите здесь:

не получается составить программу C++
Объясните сортировку C++
Не получается составить программу C++
C++ Дано вещественное x. Вычислить z = f( x ), не получается составить код
Задача на сортировку C++
Задача на сортировку C++
Сортировку вставками меняем на сортировку слиянием C++
Сортировку вставками меняем на Пирамидальную сортировку и на Сортировку подсчётом C++

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ответ Создать тему
Опции темы

Текущее время: 22:23. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru