Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
miklas
0 / 0 / 0
Регистрация: 04.01.2016
Сообщений: 7
1

Быстрая сортировка стобцов матрицы по возрастанию

24.06.2017, 13:39. Просмотров 334. Ответов 1

Всем доброго времени суток! Задается квадратная матрица с четным количеством строк и стобцов, нужно отсортировать ее столбцы по возрастанию, по схеме:
Название: практика.png
Просмотров: 20

Размер: 1.2 Кб, где пустое пространство - нули.
Есть код, который сортирует эту матрицу по строкам по схеме: Название: практика2.png
Просмотров: 20

Размер: 1.3 Кб. Нужно переделать функции sort и sort_quick, чтобы сортировались столбцы. Вариант с транспортированием матрицы желательно не предлагать.

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
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
#include <iostream>
#include <conio.h>
#include <locale.h>
using namespace std;
 
typedef int telem;      //определение типа элементов массива
typedef telem *tstr;   //определение типа "указатель на telem"
typedef tstr *tmatr;    //определение типа "указатель на указатель на telem"
void inputmatr(tmatr, int);
void outputmatr(tmatr, int);
void sort(tmatr, int);
void null(tmatr, int);
void sort_quick(tstr, int, int, int);
 
 
int main() {
    int n;      //число строк матрицы
    tmatr a;        //объявляется переменная-указатель на указатель на telem
    setlocale(LC_ALL, "Russian");
    cout << "Введите размер квадратной матрицы: ";
    do {
        cin >> n;
        if (n % 2 != 0)
            cout << "Матрица должна быть четного размера." << endl << "Повторите ввод - ";
    } while (n % 2 != 0);
    a = new tstr[n];    //выделение динамической памяти под массив
                        //указателей на строки массива
    for (int i = 0; i < n; i++)     //цикл выделения памяти под каждую строку
        *(a + i) = new telem[n];//каждому элементу массива указателей
                                //на строки присваивается адрес начала
                                //области памяти, выделяемой под строку
    inputmatr(a, n);
    cout << "Исходная матрица:\n";
    outputmatr(a, n);
    sort(a, n);
    null(a, n);
    cout << "Матрица с отсортированными строками:" << endl;
    outputmatr(a, n);
    cout << endl;
    //Освобождение динамической памяти
    for (int i = 0; i < n; i++)
        delete a[i];
    delete a;
    getch();
    return 0;
}
 
void inputmatr(tmatr a, int str) {
    cout << "Введите построчно через пробел элементы" << endl;
    cout << "двумерного массива размера " << str << "x" << str << endl;
    cout << "После ввода строки нажимайте <Enter>" << endl;
    for (int i = 0; i < str; i++)
        for (int j = 0; j < str; j++)
            cin >> *(*(a + i) + j);
}
 
void outputmatr(tmatr a, int str) {
    for (int i = 0; i < str; i++) {
        for (int j = 0; j < str; j++) {
            cout.width(2);
            cout << *(*(a + i) + j) << ' ';
        }
        cout << '\n';
    }
}
 
void sort(tmatr a, int n) {
    telem z;
    for (int i = 0, x; i < n; i++) {
        x = i < n / 2 ? n / 2 - i - 1 : i - n / 2;
        sort_quick(a[i], 0, x, 0);
        sort_quick(a[i], n - x - 1, n - 1, 1);
    }
}
 
void sort_quick(tstr a, int t, int n, int z) { //z - по возрастанию (1)/по убыванию (0)
    int i = t,      //левая граница сортируемого фрагмента
        j = n;      //правая граница сортируемого фрагмента
    telem x, y;
    x = a[(t + n) / 2];
    do {
        if (z) {
            while (a[i] < x)
                i++;
            while (x < a[j])
                j--;
        }
        else {
            while (a[i] > x)
                i++;
            while (x > a[j])
                j--;
        }
        if (i <= j)
        {
            y = a[i];
            a[i] = a[j];
            a[j] = y;
            i++;
            j--;
        }
    } while (i < j);
    if (t < j) sort_quick(a, t, j, z);
    if (i < n) sort_quick(a, i, n, z);
}
 
 
void null(tmatr a, int n) {
    for (int i = 1, x; i < n - 1; i++) {
        x = i < n / 2 ? n / 2 - i : i - n / 2 + 1;
        for (int j = x; j < n - x; j++)
            a[i][j] = 0;
    }
}
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.06.2017, 13:39
Ответы с готовыми решениями:

Быстрая сортировка по возрастанию
Добрый день, хотел попросить помощи, смотрел в интернете на тему быстрой...

Быстрая сортировка. Сложности с сортировкой по возрастанию и убыванию
Сложность в то, что не корректно работает быстрая сортировка по возрастанию и...

Быстрая сортировка матрицы
помогите пожалуста из задачей мне нужен исходничек какойто простенькой быстрой...

Сортировка матрицы по возрастанию
Есть матрица 6x6 слов длиной 4 буквы . Нужно упорядочить матрицу по...

Сортировка строк матрицы по возрастанию
#include &quot;stdafx.h&quot; #include &lt;conio.h&gt; #include &lt;iostream&gt; #include &lt;time.h&gt;...

1
miklas
0 / 0 / 0
Регистрация: 04.01.2016
Сообщений: 7
24.06.2017, 16:59  [ТС] 2
Цитата Сообщение от miklas Посмотреть сообщение
Вариант с транспортированием
С транспонированием, конечно
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.06.2017, 16:59

Сортировка матрицы змейкой по возрастанию
Здравствуйте, есть такая задача: Дана матрица (N+15)x(N+15) отсортировать по...

Сортировка элементов строк матрицы по возрастанию
Дано матрица с размером NxM надо сортировать элементы строка по возрастаню ...

Сортировка элементов в каждом столбце матрицы по возрастанию
Помогите решить в Borland c++ Если можно еще блок-схему Задана матрица...


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

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Опции темы

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