Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.64/11: Рейтинг темы: голосов - 11, средняя оценка - 4.64
2 / 2 / 0
Регистрация: 19.10.2017
Сообщений: 214
1

Быстрая сортировка матрицы по первому столбцу

08.03.2020, 22:12. Показов 2158. Ответов 17

Author24 — интернет-сервис помощи студентам
Мне нужно с помощью быстрой сортировке отсортировать матрицу. Матрица состоит из 0 и 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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
#include <iostream>
using namespace std;
 
void quicksort(int *mas, int first, int last)
{
  int mid, count;
  int f=first, l=last;
  mid=mas[(f+l) / 2]; //вычисление опорного элемента
  do{
    while (mas[f]<mid) f++;
    while (mas[l]>mid) l--;
      if (f<=l) //перестановка элементов
      {
        count=mas[f];
        mas[f]=mas[l];
        mas[l]=count;
        f++;
        l--;
      }
  } while (f<l);
  if (first<l) quicksort(mas, first, l);
  if (f<last) quicksort(mas, f, last);
}
 
int main(){
  const int n = 6; //количество стобцов + 1
  const int m = 4;
  int matr[n][m]; //матрица со значениями 0 и 1, кроме первого столбца
  int sum[m];     //сумма значений в каждой строке матрицы
  for(int j=0; j<m; j++){
    sum[j]=0;
    for(int i=1; i<n; i++){ //от 1, потому что первый столбец - это сумма строк
      cout<<" ";
      cin>>matr[i][j]; //ввожу значения матрицы
      sum[j]+= matr[i][j];  //вычисляю сумму строки
    }
    matr[0][j]=sum[j]; //заполняю первый столбец суммами строк
  }
 
  for(int i=0; i<n; i++){
    quicksort(matr[i], 0, m-1);
  }
 
  for(int j=0; j<m; j++){ //вывожу матрицу
    for(int i=0; i<n; i++){
      cout<<matr[i][j]<<" ";
    }
    cout << endl;
  }
}
Но сортировка проходит не совсем удачно, это не удивительно, но как мне подправить код я пока не знаю. Что именно не так?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
08.03.2020, 22:12
Ответы с готовыми решениями:

Сортировка по первому столбцу!
Как отсортировать что бы имя с.г культуры было в алфавитмном порядке? #include &quot;stdafx.h&quot;...

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

Сортировка данных в файле по первому и второму столбцу
Приветствую! Подскажите пожалуйста! Есть текстовый файл, структуры: Необходимо его...

Сортировка и группировка по первому столбцу И сумма каждого значения второго и третьего столбца
Здравствуйте, нужна помощь в реализации. Есть файл формата: 231,9;3;1 231,9;0;1 232,1;1;0...

17
7437 / 5029 / 2892
Регистрация: 18.12.2017
Сообщений: 15,692
09.03.2020, 02:11 2
сначала внесите правки в код, про которые Вам уже говорилось:
Ошибка в сложении массива
потом продолжим исправления

Добавлено через 6 минут
и напишите оригинал условия задачи - скорее всего столбец с суммами в матрице не нужен
0
2 / 2 / 0
Регистрация: 19.10.2017
Сообщений: 214
09.03.2020, 11:04  [ТС] 3
Цитата Сообщение от Yetty Посмотреть сообщение
сначала внесите правки в код
хорошо
Теперь насчёт нужности первого столбца. Вообще в задаче к матрице я должен добавить не один, а 4 столбца, которые представляют некие факторы, первый и самый простой я назвал. Отсортировать матрицу мне нужно так: по первому столбцу по убыванию, дальше одинаковые значения сортируем по второму столбцу, тоже по убыванию, дальше по третьему, но уже по возрастанию и по четвёртому столбцу сортируем тоже по возрастанию.
Пример:
7521..
7537..
7482..
4645..
4648..
1845..
1471..
0
7437 / 5029 / 2892
Регистрация: 18.12.2017
Сообщений: 15,692
09.03.2020, 11:25 4
Цитата Сообщение от Knzj Посмотреть сообщение
Теперь насчёт нужности первого столбца
я говорил о том, что если у Вас есть данные, например суммы строк, не обязательно помещать их в начальную матрицу, можно для них создать отдельный массив, более того можно сортировать строки матрицы по значениям элементов, находящихся в этом массиве
Цитата Сообщение от Knzj Посмотреть сообщение
Пример:
такой пример не информативен. приведите пример начальных данных (входящий массив) и конечных данных.
0
2 / 2 / 0
Регистрация: 19.10.2017
Сообщений: 214
09.03.2020, 11:48  [ТС] 5
Цитата Сообщение от Yetty Посмотреть сообщение
такой пример не информативен
давайте я проще объясню, если не поможет, приведу пример начальных данных (входящий массив) и конечных данных/
Так вот, сортировка происходит, как обычная сортировка 4-хзначного числа по убыванию, с отличаем только в том, 2 последних цифры числа мы сортируем по возрастанию.

Код
\/ \/ /\ /\
 1 1  1  1
0
7437 / 5029 / 2892
Регистрация: 18.12.2017
Сообщений: 15,692
09.03.2020, 11:56 6
Knzj, нужен пример ввода-вывода
0
2 / 2 / 0
Регистрация: 19.10.2017
Сообщений: 214
09.03.2020, 12:11  [ТС] 7
Смотрите, на ввод идёт матрица (я её добавлю из документа), дальше у неё для каждой строки будут выявлены 4 фактора, которые я добавлю в матрицу к каждой строке на позиции 0-3. Дальше я должен с помощью быстрой сортировки отсортировать матрицу по этим первым 4-м столбцам. На выход получится отсортированная матрица, которую я добавлю в файл. Не буду вас нагружать сутью этих факторов, можно принять за начало, что они уже включены в матрицу, и начать сортировку.
0
7437 / 5029 / 2892
Регистрация: 18.12.2017
Сообщений: 15,692
09.03.2020, 12:20 8
Knzj, если Вы не желаете приводить пример, дорабатывайте сами что Вам там нужно:
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
#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;
 
int main()
{
    srand((int)time(0));
    int n, m;
    cout << "n="; cin >> n;
    cout << "m="; cin >> m;
    
        int **a = new int*[n];
      for (int i = 0; i < n; i++)
          a[i]=new int[m];
  
        int*c = new int[n];    
    
    for (int i = 0; i < n; i++)
    {
        c[i]=0;    
        for (int j = 0; j < m; j++)
        {
        a[i][j]=rand()%9 + 1; 
        c[i]+=a[i][j];
        cout << a[i][j] << " ";    
        }
        cout << "  sum=" << c[i];        
        cout << "\n";
    }
    cout << "\n";     
 
    for (int i = 1; i < n; i++)    
        for (int k = 0; k < n-i; k++)        
            if (c[k]>c[k+1])
            {
                swap(c[k],c[k+1]);   
                swap(a[k],a[k+1]);
            }             
    
    for (int i = 0; i < n; ++i)
    {
        for (int j = 0; j < m; j++)        
        cout << a[i][j] << " ";       
        cout << "  sum=" << c[i];
        cout << "\n";
    }    
    
    for (int i = 0; i < n; i++)
    delete[]a[i];
    delete[]a;
    delete[]c;
system("pause");
return 0;
}
0
2 / 2 / 0
Регистрация: 19.10.2017
Сообщений: 214
09.03.2020, 12:37  [ТС] 9
Я не совсем понял, какой именно вы ходите пример, начальную матрицу (без факторов), а потом итоговую? Просто в данном случае суть не в этом. А эти факторы должны быть в матрице, для проверки работы алгоритма их можно вообще рандомно добавить и по ним сделать быстрою сортировку.
Я, надеюсь, не слишком плохо донёс мысль
0
7437 / 5029 / 2892
Регистрация: 18.12.2017
Сообщений: 15,692
09.03.2020, 14:39 10
Knzj, я там код сбросил, если заметили. по такому принципу нужно сортировать ?

что Вам неясно насчёт примера ? у Вас есть матрица. она находится в файле. Вы хотите её отсортировать каким-то образом и записать в другой файл. напишите какая матрица в первом файле и какая матрица должна оказаться во втором файле, а также критерии сортировки.
0
2 / 2 / 0
Регистрация: 19.10.2017
Сообщений: 214
09.03.2020, 19:46  [ТС] 11
Yetty,
Цитата Сообщение от Yetty Посмотреть сообщение
по такому принципу нужно сортировать
Мне надо отсортировать быстрой сортировкой.
Моя матрица 40 на 21, но я вам покажу пример поменьше. Итак, вот начальная матрица, я решил уже тут указать сумму
Быстрая сортировка матрицы по первому столбцу

1) Я отсортировал матрицу по убыванию суммы строк.
2) Я отсортировал матрицу по некому критерию, тоже по убыванию.
3) Если некоторые значения после выполнения (2) равны, то я сортирую по 3-му фактору (по возрастанию).
4) Если некоторые значения после выполнения (3) тоже равны, то я сортирую по последнему 4-му фактору (по возрастанию).
В итоге у меня получается следующее:
Быстрая сортировка матрицы по первому столбцу

Ничего, что в таком виде?
0
2 / 2 / 0
Регистрация: 19.10.2017
Сообщений: 214
09.03.2020, 19:50  [ТС] 12
Вот тут немного подробнее:
Пример.docx
0
7437 / 5029 / 2892
Регистрация: 18.12.2017
Сообщений: 15,692
09.03.2020, 20:57 13
Knzj, как отсортировать по сумме я показал в коде, дальше я не понимаю, где Вы берёте значения ind2 и что нужно сортировать, если значения ind2 уже заранее отсортированы по убыванию
ind2
5
2
2
1
0
0
0
2 / 2 / 0
Регистрация: 19.10.2017
Сообщений: 214
09.03.2020, 21:18  [ТС] 14
Насчёт того откуда берётся ind2, если надо объясню чуть попозже (это не очень быстро объяснишь), а насчёт того, что по ind2 отсортировано, это не верно, посмотрите вторую и третью версии матриц.
0
7437 / 5029 / 2892
Регистрация: 18.12.2017
Сообщений: 15,692
09.03.2020, 21:44 15
хорошо, по первому столбцу (там где суммы) отсортировали. дальше хотите те же самые строки отсортировать по второму столбцу ? если да, элементы столбца суммы тоже включать ?

Добавлено через 7 минут
почему меняется количество строк ?
0
2 / 2 / 0
Регистрация: 19.10.2017
Сообщений: 214
09.03.2020, 22:56  [ТС] 16
Цитата Сообщение от Yetty Посмотреть сообщение
элементы столбца суммы тоже включать
Вообще, я поглядел на задачу, столбцы суммы можно и не включать, а вот ind2,3,4 обязательно.
Цитата Сообщение от Yetty Посмотреть сообщение
дальше хотите те же самые строки отсортировать по второму столбцу ?
Да
Цитата Сообщение от Yetty Посмотреть сообщение
почему меняется количество строк ?
Вы про нижнюю строку выделенную жирным в 3 и 4 версиях матрицы?
Это вспомогательные значения нужны только для вычисления ind3, она в матрицу не входит.
0
7437 / 5029 / 2892
Регистрация: 18.12.2017
Сообщений: 15,692
09.03.2020, 23:02 17
Цитата Сообщение от Knzj Посмотреть сообщение
Да
так сортируйте - я же Вам уже показал принцип
Цитата Сообщение от Knzj Посмотреть сообщение
Вы про нижнюю строку выделенную жирным
нет, я про матрицы в вордовском файле, там пять матриц с такими размерами: 7x10, 7x10, 6x10, 6x10, 4x10
0
2 / 2 / 0
Регистрация: 19.10.2017
Сообщений: 214
09.03.2020, 23:11  [ТС] 18
А, ну в 3 и 4 случаях - это я упустил одну строку, где ind2 = 0, а насчёт последней - это уже я работаю с итоговой матрицей и беру оттуда нужные мне данные, на неё можно не смотреть.

Добавлено через 5 минут
Цитата Сообщение от Yetty Посмотреть сообщение
так сортируйте - я же Вам уже показал принцип
Мне надо именно быструю сортировку (quicksort), изначально стояла проблема (самое начало) именно в моём неумении её перевести в виде кода и непосредственно использовать в данной задаче. Хотя вы меня натолкнули на идею, как её можно реализовать, так что я попробую переделать.
0
09.03.2020, 23:11
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
09.03.2020, 23:11
Помогаю со студенческими работами здесь

Найти среднее арифметическое элементов, принадлежащих первой строке, последней строке, первому столбцу и последнему столбцу.
Дан двумерный массив размером n*m, заполненный случайными числами. Найти среднее арифметическое...

В прямоугольной матрице найти сумму элементов, принадлежащих первой строке, последней строке, первому столбцу и последнему столбцу
в прямоугольной матрице найти сумму элементов, принадлежащих первой строке, последней строке,...

Сортировка матрицы по k-ому столбцу
Добрый день. В лабораторной работе нужно ввести с консоли n - размерность матрицы a . Задать...

Сортировка матрицы по строке/столбцу
Как отсортировать матрицу по n строке? Нужно отсортировать матрицу, например по 2 столбцу. То...


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

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru