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

Сортировка строк матрицы в порядке возрастания их средних арифметических значений - C++

Восстановить пароль Регистрация
 
Кротяка
 Аватар для Кротяка
5 / 5 / 0
Регистрация: 20.12.2010
Сообщений: 370
14.05.2014, 21:02     Сортировка строк матрицы в порядке возрастания их средних арифметических значений #1
Необходимо строки матрицы переставить в порядке возрастания их средних арифметических значений. Вот что у меня получилось:
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
    int n = A.getN();//строки матрицы
    int m = A.getM();//столбцы матрицы
    float* avg = new float[n];//массив средних арифметических значений строк матрицы
        
        //находим среднее арифметическое каждой строки
        for(int i = 0; i < n; i++)
        {
            float sum = 0;
            for(int j = 0; j < m; j++)
                sum += A.getMatrixElement(i, j);
            avg[i] = sum / m;
            cout<<avg[i]<<endl;
        }
 
        //сортируем строки матрицы
        for(int i = 0; i < n; i++)
            for(int j = i; j < n; j++)
                if(avg[i] > avg[j])
                {
                    for(int k = 0; k < m; k++)
                    {
                        int tmp = A.getMatrixElement(i, k);
                        A.setMatrixElement(i, k, A.getMatrixElement(j, k));
                        A.setMatrixElement(j, k, tmp);
                    }
                    
                    int tmp = avg[i];
                    avg[i] = avg[j];
                    avg[j] = tmp;
                }
Сортирует не совсем правильно, хотелось бы подправить
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.05.2014, 21:02     Сортировка строк матрицы в порядке возрастания их средних арифметических значений
Посмотрите здесь:

Найти наибольшее среди средних арифметических значений строк матрицы C++
C++ Сформировать вектор из средних арифметических значений по строкам матрицы
Сформировать матрицу, найти наибольшее среди средних арифметических элементов ее строк C++
C++ Сформировать матрицу размером MxN и найти наибольшее среди средних арифметических элементов ее строк.
Сортировка 3 чисел в порядке возрастания C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Кротяка
 Аватар для Кротяка
5 / 5 / 0
Регистрация: 20.12.2010
Сообщений: 370
16.05.2014, 05:06  [ТС]     Сортировка строк матрицы в порядке возрастания их средних арифметических значений #2
нужно, насколько я понимаю, применить сортировку выбором, но сделать это для двумерного массива с данным условием у меня не получается

Добавлено через 5 часов 23 минуты
вот наработки, сортирует "вроде как" правильно, но не во всех случаях
хотелось бы узнать, где ошибка/ошибки
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
template <class T> void PreobrMatrix(Matrix<T>& A)
{
    int num;
    int n = A.getN();
    int m = A.getM();
    double tmp, temp, min_avg;
    double* avg = new double[n];
    
    //находим среднее арифметическое каждой строки
    for(int i = 0; i < n; i++)
    {
        float sum = 0;
        for(int j = 0; j < m; j++)
            sum += A.getMatrixElement(i, j);
        avg[i] = sum / m;
    }       
        
    //преобразовываем матрицу
    min_avg = avg[0];
    for(int i = 0; i < n; i++)
    {
        if(min_avg > avg[i])
        {
            min_avg = avg[i];
            num = i;
            for(int j = 0; j < n; j++)
            {
                tmp = avg[num];
                avg[num] = avg[j];
                avg[j] = tmp;
                for (int k = 0; k < m; k++)
                {
                    temp = A.getMatrixElement(num, k);
                    A.setMatrixElement(num, k, A.getMatrixElement(j, k));
                    A.setMatrixElement(j, k, temp);
                }
            }               
        }
    }
 
    cout<<endl<<"Массив средних арифметических:"<<endl;
    for(int i = 0; i < n; i++)
        cout<<avg[i]<<"  ";
    cout<<endl;
 
    cout<<endl<<"Преобразованная матрица:"<<endl<<endl; 
}
outoftime
║XLR8║
 Аватар для outoftime
505 / 427 / 33
Регистрация: 25.07.2009
Сообщений: 2,297
16.05.2014, 06:32     Сортировка строк матрицы в порядке возрастания их средних арифметических значений #3
Кротяка, для сортировки по среднему арифметическому достаточно иметь целое значение, делить не обязательно, можно по суме сортировать результат будет тем же.

Я бы завел 2 массива размерностью n, оба заполнил бы сумами соответствующих строк с помощью std::accumulate и, отсортировав первый, прошелся бы по нему сравнивая значения со вторым, если не совпадают ищу первый индекс элемента с таким же значением и меняю его с текущим, также делая со строками матрицы.
Андрей2002
4 / 4 / 2
Регистрация: 20.04.2014
Сообщений: 64
16.05.2014, 06:54     Сортировка строк матрицы в порядке возрастания их средних арифметических значений #4
Вот исправь это min_avg = avg[0]; запиши в min_avg разность всех значений, чтобы оно точно было меньше всех средних арифметических, как я понял в этом и проблема. Ты сравниваешь с нулевым элементов, а он может оказаться минимальным
Qazan
211 / 59 / 9
Регистрация: 30.04.2013
Сообщений: 780
Записей в блоге: 10
16.05.2014, 14:08     Сортировка строк матрицы в порядке возрастания их средних арифметических значений #5
Цитата Сообщение от outoftime Посмотреть сообщение
для сортировки по среднему арифметическому ... делить не обязательно
Это да


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
void    SwapString(double ** &A,int i,int k) // Такой метод сделай в классе
{
    if(i == k) return;
 
    double * p = A[i];
     A[i] = A[k];
     A[k] = p;
}
 
void SelectionSort(int * p,int n)
{
    for(int i = 0;i < n;i++)
    {
        int min = p[i]; 
        int index = i;
 
        for(int j = i + 1;j < n;j++)
        {
            if(min > p[j])
            {
                index = j;
                min = p[index];
            }
        }
 
        int t = p[i];
        p[i] = p[index];
        p[index] = t;
                // Здесь меняй строки
    }
}
Кротяка
 Аватар для Кротяка
5 / 5 / 0
Регистрация: 20.12.2010
Сообщений: 370
19.05.2014, 22:50  [ТС]     Сортировка строк матрицы в порядке возрастания их средних арифметических значений #6
Qazan, что то мне не совсем понятно, как должен работать ваш код

Добавлено через 17 минут
outoftime, можете на примере кода показать? А то я ужасно путаюсь, когда пытаюсь всё это провернуть
outoftime
║XLR8║
 Аватар для outoftime
505 / 427 / 33
Регистрация: 25.07.2009
Сообщений: 2,297
20.05.2014, 01:49     Сортировка строк матрицы в порядке возрастания их средних арифметических значений #7
Кротяка,
Кликните здесь для просмотра всего текста
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
#include <iostream>
#include <vector>
#include <memory>
#include <algorithm>
#include <iterator>
 
class matrix {
public:
    matrix(const size_t& width = 2, const size_t& height = 2) 
        : rows(height), cols(width) 
    {
        array = new int*[rows];
        for (size_t i = 0; i < rows; ++i) {
            array[i] = new int[cols];
            std::generate(array[i], array[i] + cols, 
                [](){ return rand() % 100; });
        }
    }
    
    void set(const size_t& row, const size_t& col, const int& value) {
        array[row][col] = value;
    }
    
    int& get(const size_t& row, const size_t& col) const { return array[row][col]; }
    
    const size_t& getRows() const { return rows; }
    
    const size_t& getCols() const { return cols; }
    
    void sortByAverangeValue() {
        int* sums = new int[rows];
        for (size_t i = 0; i < rows; ++i) {
            sums[i] = std::accumulate(array[i], array[i] + cols, 0);
        }
        
        std::sort(array, array + rows, [&](int* a, int* b) {
            size_t i = std::distance(array[1], a),
                j = std::distance(array[1], b);
            return sums[i] < sums[j];
        });
        
        delete sums;
    }
    
    friend std::ostream& operator<< (std::ostream& out, const matrix& m) {
        for (size_t i = 0; i < m.rows; ++i) {
            for (size_t j = 0; j < m.cols; ++j)
                out << m.array[i][j] << ' ';
            out << std::endl;
        }
        
        return out;
    }
    
private:
    const size_t rows, cols;
    int** array;
};
 
int main () {
    matrix m(2, 4);
    std::cout << "Before\n" << m;
    m.sortByAverangeValue();
    std::cout << "After\n" << m;
}

Сортировка не работает. Если кто скажет почему поставлю +1.
Qazan
211 / 59 / 9
Регистрация: 30.04.2013
Сообщений: 780
Записей в блоге: 10
20.05.2014, 14:13     Сортировка строк матрицы в порядке возрастания их средних арифметических значений #8
Добавлено через 4 минуты
outoftime, какая сортироовка ?

Добавлено через 3 минуты
Кротяка, что именно не ясно ?
код рабочий

сортировка выбором :
http://ru.wikipedia.org/wiki/%D0%A1%...80%D0%BE%D0%BC

Добавлено через 7 минут


void и возврат
outoftime
║XLR8║
 Аватар для outoftime
505 / 427 / 33
Регистрация: 25.07.2009
Сообщений: 2,297
20.05.2014, 14:49     Сортировка строк матрицы в порядке возрастания их средних арифметических значений #9
Цитата Сообщение от Qazan Посмотреть сообщение
какая сортироовка ?
Сортировка строк матрицы в порядке возрастания их средних арифметических значений строка 36

Добавлено через 2 минуты
Qazan, индексы определяются неверно. Без понятия почему.
Qazan
211 / 59 / 9
Регистрация: 30.04.2013
Сообщений: 780
Записей в блоге: 10
20.05.2014, 16:11     Сортировка строк матрицы в порядке возрастания их средних арифметических значений #10
outoftime, Ага , а сортировка какая ?
всмысле (пузырек,простые вставки, быстрая сортировка, сортировка выбором ..)
outoftime
║XLR8║
 Аватар для outoftime
505 / 427 / 33
Регистрация: 25.07.2009
Сообщений: 2,297
20.05.2014, 18:10     Сортировка строк матрицы в порядке возрастания их средних арифметических значений #11
Qazan, std::sort реализует qsort, причем без оптимизаций.
Qazan
211 / 59 / 9
Регистрация: 30.04.2013
Сообщений: 780
Записей в блоге: 10
20.05.2014, 19:03     Сортировка строк матрицы в порядке возрастания их средних арифметических значений #12
Добавлено через 36 минут
C++
1
2
3
4
5
 std::sort(array, array + rows, [&](int* a, int* b) {
            size_t i = std::distance(array[1], a),
                j = std::distance(array[1], b);
            return sums[i] < sums[j];
        });
Тут у вас сортировка массива указателей ,а в distance подается ,что ?
значение в канкретной точке массива ;
Функция должна брать итератор ,тобишь указатель .

По значению она не может определить расстояние между двумя элементами ,она думает ,что это адреса и выдает вообще говоря иное значение
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.05.2014, 15:23     Сортировка строк матрицы в порядке возрастания их средних арифметических значений
Еще ссылки по теме:

C++ Сортировка 3-х значных чисел в порядке возрастания
C++ Сортировать строки матрицы n * m в порядке убывания значений первых элементов строк
C++ Сортировка строк матрицы в алфавитном порядке

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

Или воспользуйтесь поиском по форуму:
Кротяка
 Аватар для Кротяка
5 / 5 / 0
Регистрация: 20.12.2010
Сообщений: 370
23.05.2014, 15:23  [ТС]     Сортировка строк матрицы в порядке возрастания их средних арифметических значений #13
всем спасибо, решение найдено
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
template <class T> void PreobrMatrix(Matrix<T>& A)
{
    int num;
    int n = A.getN();
    int m = A.getM();
    double tmp, temp;
    double* avg = new double[n];
    
    //находим среднее арифметическое каждой строки
    for(int i = 0; i < n; i++)
    {
        float sum = 0;
        for(int j = 0; j < m; j++)
            sum += A.getMatrixElement(i, j);
        avg[i] = sum /m;
    }       
        
    
       //сортируем строки матрицы
    for(int i = 0; i < n; i++)
    {
        int k;
        int p = i; 
        tmp = avg[i];
 
        for(int j = i + 1; j < n; j++)
        {
            if (avg[j] < tmp) 
            {
                p = j; 
                tmp = avg[j]; 
            }
        }
 
        avg[p] = avg[i];
        avg[i] = tmp;
 
        for(k = 0; k < m; k++)
        {
            tmp = A.getMatrixElement(i, k);
            A.setMatrixElement(i, k, A.getMatrixElement(p, k));
            A.setMatrixElement(p, k, tmp);
        }
    }
 
    cout<<endl<<"Массив средних арифметических:"<<endl;
    for(int i = 0; i < n; i++)
        cout<<avg[i]<<"  ";
    cout<<endl;
 
    cout<<endl<<"Преобразованная матрица:"<<endl<<endl; 
}
Yandex
Объявления
23.05.2014, 15:23     Сортировка строк матрицы в порядке возрастания их средних арифметических значений
Ответ Создать тему
Опции темы

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