Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.83/6: Рейтинг темы: голосов - 6, средняя оценка - 4.83
139 / 139 / 39
Регистрация: 26.02.2011
Сообщений: 548

Сортировка самого столбца

12.09.2012, 18:19. Показов 1290. Ответов 11

Студворк — интернет-сервис помощи студентам
Вообщем возникли затруднения со следующим
Матрица есть,раньше как то делал сортировку столбцов матрицы,а чтобы сами столбцы сортировались оставаясь на своих местах не приходилось,надеюсь поможет кто кодом

Нужно отсортировать САМ столбец по убыванию элементов,и так про каждый столбец.Пример
Исходная
Code
1
2
3
1.33  4.14  2.14  7.44
0.41  8.87     9  1.44
5.53  7.12  3.01  4.45
Отсортированная должна быть так(сам столбец сортируется)

C++ (Qt)
1
2
3
0.41  4.14  2.14  1.44
1.33  7.12  3.01  4.45
5.53  8.87     9  7.44
Заготовка
C++ (Qt)
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
#include "stdafx.h"
#include <iostream>
#include <locale.h>
#include <conio.h>
#include <ctime> 
#include <iomanip> 
 
using namespace std;
 
int main()
{
    int m,n,i,j,k,temp=0;
    float x;
    
    setlocale(LC_ALL, "RUSSIAN");
    cout<<"\tVvedite razmernost matrix\n";
    cout<<"\nStrok: ";
        cin>>m;
    cout<<"Stolbcov: ";
    cin>>n;
    float **a=new float*[m];
    float *b=new float[m*n];
    for(i=0;i<m;i++)                       
    {
            a[i]=new float[n];
    }
    cout<<endl<<"\tMatrix\n\n";
    srand(time(NULL));
    for(i=0;i<m;i++)                        
    {
        for (j=0;j<n;j++)                  
        {
            a[i][j]=(rand() % 10 + 1) / float((rand() % 10 + 1));//числа от a до b рамдомно расположенные в матрице
             cout << setw(4) <<setprecision(2) <<a[i][j]<<" ";
        }
        cout<<endl;
    }
    cout<<endl<<"\tSortMatrix\n\n";
 
/*код.......*/
 
    for(i=0;i<m;i++)                        
    {
        for (j=0;j<n;j++)                  
        {
             cout << setw(4) <<setprecision(2) <<a[i][j]<<" ";
        }
        cout<<endl;
    }
    for(int i = 0; i < m; i++)
                {
                    delete [] a[i];
                }
                delete [] a;
    getch();
    return 0;
}
По идее в голову идет следующий алгоритм
1)Выписать столбец в одномерный массив
2)Упорядочить масив по убыванию
3)Записать полученный масив как столбец
4)Взять следующий столбец матрицы

Если это верно то на деле пока не получается реализовать,мож поможет кто кодом))
1
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
12.09.2012, 18:19
Ответы с готовыми решениями:

Сортировка двумерного массива по убыванию отношений элементов первого столбца к элементам правого столбца
Привет. Решал задачу о непрерывном рюкзаке и столкнулся с проблемой, что не могу отсортировать двумерный массив, состоящий из двух...

Найти номер самого левого столбца содержащего только положительные элементы
Найти номер самого левого столбца содержащего только положительные элементы. Если такого столбца нет, то вывести сообщение. Создание,...

Найти номера строки и столбца самого меньшего элемента матрицы
Дана матрица размера M х N. Найти номера строки и столбца самого меньшего элемента матрицы, чем среднее арифметическое значение всех ее...

11
 Аватар для Toshkarik
1181 / 894 / 94
Регистрация: 03.08.2011
Сообщений: 2,461
12.09.2012, 18:37
Все намного проще:
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
int main() {
   std::size_t size = 5;
   int **array = new int *[ size ];
   int temp;
   bool flag = true;
   
   for ( std::size_t i = 0; i < size; i++ ) {
      array[ i ] = new int [ size ];
      
      for ( std::size_t j = 0; j < size; j++ )
         std::cout << ( array[ i ][ j ] = std::rand() % ( size + size )) << ' ';
      
      std::cout << std::endl;
   }
   
   std::cout << std::endl;
   
   for ( std::size_t i = 0; i < size; i++ ) {
      flag = true;
      
      for ( std::size_t lowBorder = size, curPos; flag; lowBorder-- ) {
         for ( curPos = 1, flag = false; curPos < lowBorder; curPos++ ) {
            if ( array[ curPos ][ i ] < array[ curPos - 1 ][ i ]) {
               temp = array[ curPos ][ i ];
               array[ curPos ][ i ] = array[ curPos - 1 ][ i ];
               array[ curPos - 1 ][ i ] = temp;
               flag = true;
            }
         }
      }
   }
   
   
   for ( std::size_t i = 0; i < size; i++ ) {
      for ( std::size_t j = 0; j < size; j++ )
         std::cout << array[ i ][ j ] << ' ';
      
      std::cout << std::endl;
   }
 
   return 0;
}
1
 Аватар для BumerangSP
4311 / 1423 / 463
Регистрация: 16.12.2010
Сообщений: 2,939
Записей в блоге: 3
12.09.2012, 18:44
a.n.o.n.i.m, через доп массив конечно можно, но можно и так:
C++
1
2
3
4
5
 for (int l=0; l<m; l++) 
   for (i=0; i<m; i++)
    for (j=0; j<m; j++)
      if (a[i][l]<a[j][l])
       swap(a[i][l],a[j][l]);
1
Кошковед
 Аватар для co6ak
521 / 509 / 63
Регистрация: 12.04.2010
Сообщений: 1,390
12.09.2012, 18:56
бгг.
на все случаи жизни
в данном примере в функцию arraySort можно передавать каждый столбец матрицы.
все там весьма примитивно. даже сортир пузырьковый


надо же пиарить тему свою
1
 Аватар для Toshkarik
1181 / 894 / 94
Регистрация: 03.08.2011
Сообщений: 2,461
12.09.2012, 18:59
co6ak, как Вы собираетесь передавать столбец в функцию, если его элементы расположены в разных выделенных частях памяти?
1
Эксперт С++
 Аватар для valeriikozlov
4728 / 2549 / 757
Регистрация: 18.08.2009
Сообщений: 4,568
12.09.2012, 19:03
вариант (из первичного кода):
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
#include "stdafx.h"
#include <iostream>
#include <locale.h>
#include <conio.h>
#include <ctime> 
#include <iomanip> 
 
using namespace std;
 
int main()
{
    int m,n,i,j,k,temp;
    float x;
    
    setlocale(LC_ALL, "RUSSIAN");
    cout<<"\tVvedite razmernost matrix\n";
    cout<<"\nStrok: ";
        cin>>m;
    cout<<"Stolbcov: ";
    cin>>n;
    float **a=new float*[m];    
    for(i=0;i<m;i++)                       
    {
            a[i]=new float[n];
    }
    cout<<endl<<"\tMatrix\n\n";
    srand(time(NULL));
    for(i=0;i<m;i++)                        
    {
        for (j=0;j<n;j++)                  
        {
            a[i][j]=(rand() % 10 + 1) / float((rand() % 10 + 1));//числа от a до b рамдомно расположенные в матрице
             cout << setw(4) <<setprecision(2) <<a[i][j]<<" ";
        }
        cout<<endl;
    }
    cout<<endl<<"\tSortMatrix\n\n";
    for(i=0; i<n; i++)
    {
        for(j=0; j<m-1; j++)
        {
            temp=j;
            for(k=j+1; k<m; k++)
                if(a[temp][i]>a[k][i])
                    temp=k;
            x=a[j][i]; a[j][i]=a[temp][i]; a[temp][i]=x;
        }
    }
 
 
 
    for(i=0;i<m;i++)                        
    {
        for (j=0;j<n;j++)                  
        {
             cout << setw(4) <<setprecision(2) <<a[i][j]<<" ";
        }
        cout<<endl;
    }
    for(i = 0; i < m; i++)
                {
                    delete [] a[i];
                }
                delete [] a;
    getch();
    return 0;
}
2
79 / 79 / 8
Регистрация: 14.10.2009
Сообщений: 121
12.09.2012, 19:20
Просто берем и сортируем столбцы. ^_^
И да отучайтесь писать код как в первом посте.

Если бы я был студентом, то в этой задаче написал бы свой итератор. Чтобы пожоще было.
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
#define _CRT_SECURE_NO_WARNINGS
#include <algorithm>
#include <functional>
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
 
float **matrix;
int rows, columns;
 
float **BuildMatrix(int _rows, int _columns);
void    PrintMatrix(float **_matrix, int _rows, int _columns);
 
int main()
{
    srand(GetTickCount());
 
    printf("Universal matrix column sorting programm.\n");
    printf("Enter Matrix data.\n");
    printf("rows num: ");
    scanf("%d", &rows);
    printf("columns num: ");
    scanf("%d", &columns);
    printf("Building matrix %dx%d ...\n\n", rows, columns);
    matrix = BuildMatrix(rows, columns);
 
    PrintMatrix(matrix, rows, columns);
 
    printf("\nSorting columns ... \n\n");
 
    for(int i = 0; i < rows; i++)
    {
        std::sort(&matrix[i][0], &matrix[i][columns], std::less<float>());
    }
 
    PrintMatrix(matrix, rows, columns);
 
    printf("\n");
    system("pause");
 
    return 0;
}
 
float **BuildMatrix(int _rows, int _columns)
{
    float **matrix;
 
    matrix = new float *[_rows];
 
    for(int i = 0; i < _rows; i++)
    {
        matrix[i] = new float[_columns];
 
        for(int k = 0; k < _columns; k++)
        {
            matrix[i][k] = (rand() % 10 + 1) / float((rand() % 10 + 1));
        }
    }
    return matrix;
}
 
void PrintMatrix(float **_matrix, int _rows, int _columns)
{
    for(int i = 0; i < _columns; i++)
    {
        for(int k = 0; k < _rows; k++)
        {
            printf("%.2f ", matrix[k][i]);
        }
 
        printf("\n");
    }
}
1
139 / 139 / 39
Регистрация: 26.02.2011
Сообщений: 548
12.09.2012, 19:27  [ТС]
Мужики,прям порадовали,спасибо,столько ответов пасиб кто помог,будем дальше продолжать ,это только начало))
1
139 / 139 / 39
Регистрация: 26.02.2011
Сообщений: 548
18.09.2012, 14:27  [ТС]
Можете еще раз помочь сделать,написать сортировку выбором и пузырьком тоесть 2 функции добавить в одной будет выбором во второй пузырьком?

Добавлено через 15 минут
и кстате сортировка то по не возрастанию(тоесть убыванию),во всех примерах наоборот
1
Кошковед
 Аватар для co6ak
521 / 509 / 63
Регистрация: 12.04.2010
Сообщений: 1,390
18.09.2012, 14:28
Цитата Сообщение от ProNoooob Посмотреть сообщение
Просто берем и сортируем столбцы. ^_^
И да отучайтесь писать код как в первом посте.

Если бы я был студентом, то в этой задаче написал бы свой итератор. Чтобы пожоще было.
Кликните здесь для просмотра всего текста
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
#define _CRT_SECURE_NO_WARNINGS
#include <algorithm>
#include <functional>
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
 
float **matrix;
int rows, columns;
 
float **BuildMatrix(int _rows, int _columns);
void    PrintMatrix(float **_matrix, int _rows, int _columns);
 
int main()
{
    srand(GetTickCount());
 
    printf("Universal matrix column sorting programm.\n");
    printf("Enter Matrix data.\n");
    printf("rows num: ");
    scanf("%d", &rows);
    printf("columns num: ");
    scanf("%d", &columns);
    printf("Building matrix %dx%d ...\n\n", rows, columns);
    matrix = BuildMatrix(rows, columns);
 
    PrintMatrix(matrix, rows, columns);
 
    printf("\nSorting columns ... \n\n");
 
    for(int i = 0; i < rows; i++)
    {
        std::sort(&matrix[i][0], &matrix[i][columns], std::less<float>());
    }
 
    PrintMatrix(matrix, rows, columns);
 
    printf("\n");
    system("pause");
 
    return 0;
}
 
float **BuildMatrix(int _rows, int _columns)
{
    float **matrix;
 
    matrix = new float *[_rows];
 
    for(int i = 0; i < _rows; i++)
    {
        matrix[i] = new float[_columns];
 
        for(int k = 0; k < _columns; k++)
        {
            matrix[i][k] = (rand() % 10 + 1) / float((rand() % 10 + 1));
        }
    }
    return matrix;
}
 
void PrintMatrix(float **_matrix, int _rows, int _columns)
{
    for(int i = 0; i < _columns; i++)
    {
        for(int k = 0; k < _rows; k++)
        {
            printf("%.2f ", matrix[k][i]);
        }
 
        printf("\n");
    }
}
и отучайтесь использовать глобальные переменные, ога
0
139 / 139 / 39
Регистрация: 26.02.2011
Сообщений: 548
18.09.2012, 14:31  [ТС]
а нет верно вроде все,тупанул,просто сортировки нужны

Добавлено через 1 минуту
Глобальные переменные не использую никогда,и где здесь сортировка первая и где вторая?
1
Кошковед
 Аватар для co6ak
521 / 509 / 63
Регистрация: 12.04.2010
Сообщений: 1,390
18.09.2012, 15:17
возможные ошибки поправишь. компиль не съест мой код
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
91
92
#include <iostream>
#include <cstdlib>
#include <ctime>
 
 
void matrPrint      ( flaot **, int, int );
void matrSortBubl   ( flaot **, int, int );
void matrSortChng   ( flaot **, int, int );
void matrRandom     ( flaot **, int, int );
 
int main() {
    srand( time ( 0 ) );
    int row;
    int column;
    float **matrix;
    
    
    std::cout << "\nEnter number of rows: ";
    std::cin >> row;
    std::cout << "\nEnter number of columns: ";
    std::cin >> column;  
 
    matrix = new int* [ row ];
    for ( int i = 0; i < row; i ++ )
        matrix[i] = new int [ column ] ;
    matrRandom( matrix, row, column );
    
    matrSortBubl( matrix, row, column );
    matrPrint( matrix, row, column );
    
    
    
    std::cout << "New one";
    
    matrRandom(matrix, row, column );
    matrSortChng( matrix, row, column );
    matrPrint( matrix, row, column );
    
    for ( int i = 0; i < row; i ++ )
       delete [] matrix[i];
    delete [] matrix;
    
    return 0;
}
 
 
void matrRandom( float ** matr, int row, int column )
{
    for ( int i = 0; i < row; i ++ )
        for ( int j = 0; j < column; j ++ )
            matr[i][j] = (std::rand() % 50 - std::rand() % 25) / std::rand() % 10;
    matrPrint( matr, row, column );
}
 
void matrSortBubl( float **matr, int row, int column )
{
    float tmp;
    for ( int i = 0; i < column; i ++ )
    {
        for ( int j = 0; j < row - 1; j ++ )
            if (  matr[i][j + 1] > matr[i][j] ) 
            {
                tmp = matr[i][j+1];
                matr[i][j+1] = matr[i][j];
                matr[i][j] = tmp;
            }
    }
}
void matrSortChng( float **matr, int row, int column ) {
    float tmp;
    for ( int l = 0; k < column; k ++ ) {
        for(int i = 0; i < row-1; i++){
            int min = i;
            for (int j = i + 1;j < row; j++){
                if( matrix[j][l]< matrix[j][min])
                    min=j;
            }
        matrix[i][l] = matrix[min][l]);
        }
    }
}
 
void matrPrint ( float **matrix, int row, int column )
{
    std::cout << std::endl;
    for ( int i = 0; i < row; i ++ )
    {
        for ( int j = 0; j < column; j ++ )
            std::cout << matrix[i][j] << "\t";
        std::cout << std::endl;
    }
}
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
18.09.2012, 15:17
Помогаю со студенческими работами здесь

Найти номера строки и столбца самого меньшего элемента матрицы
помогите решить задачу на С# Дана матрица размера M х N. Найти номера строки и столбца самого меньшего элемента матрицы и вывести на...

Определить номер самого левого столбца матрицы, содержащего только положительные элементы
Написать функцию, которая в матрице размером m * n определяет номер самого левого столбца, содержащего только положительные элементы. Если...

Поиск минимального элемента третьей строки массива или самого правого столбца из них
Дан двухмерный массив. Определить номер столбца, в котором расположен минимальный элемент третьей строки массива. Если элементов с...

Найти номера строки и столбца самого меньшего элемента матрицы, чем среднее арифметическое значение всех ее элементов
Дана матрица размера M х N. Найти номера строки и столбца самого меньшего элемента матрицы, чем среднее арифметическое значение всех ее...

Найти номера строки и столбца самого меньшего элемента матрицы, чем среднее арифметическое значение всех ее элементов
пожалуйста помогите исправить програму чтоб правельно выводил номер строки и столбца матрицы условие: Дана матрица размера M х N. Найти...


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит переходные токи и напряжения на элементах схемы. . . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru