С Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.67
Galateo
0 / 0 / 0
Регистрация: 27.12.2013
Сообщений: 9
#1

Быстрая сортировка элементов столбцов двумерного массива, стоящих на четных позициях - C++

24.11.2014, 17:09. Просмотров 1325. Ответов 13
Метки нет (Все метки)

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

помогите, пожалуйста)
как отсортировать столбцы двумерного массива по убыванию, я понимаю. но мне нужно отсортировать только некоторые.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.11.2014, 17:09
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Быстрая сортировка элементов столбцов двумерного массива, стоящих на четных позициях (C++):

Вывод элементов массива, стоящих на четных позициях, а затем – на нечетных - C++
добрый времени суток помогите решить задачку: разработайте программу, в которой реализован ввод элементов одномерного массива и вывод...

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

Быстрая сортировка двумерного массива - C++
Нужно отсортировать двумерный массив по убыванию быстрой сортировкой. Вроде всё работает, но не сортирует. В чём может быть дело? ...

Быстрая сортировка двумерного массива - C++
Здравствуйте. У меня есть задание по сортировкам. Нужно заданный двумерный массив из рандомных чисел отсортировать по возрастанию по...

Быстрая сортировка двумерного массива - C++
Возникла проблема с програмой в которой применяется быстрая сортировка двумерного массива. При попытке скомпилировать выдает ошибку: ...

Быстрая сортировка двумерного массива - C++
Помогите разобраться с быстрой сортировкой! Для одномерного массива всё понятно, но как сортировать двумерный массив не понимаю. Если б мне...

13
Тамика
Котовчанин
917 / 461 / 145
Регистрация: 16.02.2010
Сообщений: 3,229
Записей в блоге: 27
24.11.2014, 17:12 #2
Проверяете номер стоблца на четность. о_О

Добавлено через 43 секунды
А если нужно все чётные в одну сортировку - в отдельный массив и сортируем.
0
Zazy
45 / 45 / 15
Регистрация: 14.04.2013
Сообщений: 186
24.11.2014, 17:16 #3
Vector использовать можно ?
в задании матрица или размерность каждого столбца произвольная ?
0
Galateo
0 / 0 / 0
Регистрация: 27.12.2013
Сообщений: 9
24.11.2014, 17:43  [ТС] #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
//сортировка столбцов
void quicksort_colum(int **matr, int j, int first, int last)
// j - номер сортируемого столбца
{
    int mid, count;
    int f=first, l=last;
    mid = matr [(f+l) / 2][j]; //вычисление опорного элемента
    do
    {
        while (matr [f][j] > mid) f++;
        while (matr [l][j] < mid) l--;
        if (f<=l) //перестановка элементов
        {
            count = matr[f][j];
            matr [f][j]=matr [l][j];
            matr [l][j]=count;
            f++;
            l--;
        }
    } while (f<l);
 
    if (first<l) quicksort_colum(matr, j, first, l);
    if (f<last) quicksort_colum(matr, j, f, last);
}
а это вызов:
C++
1
2
3
4
5
6
7
8
9
10
11
// Создание двумерного массива
    int ** Matric = new int * [intRow];
    for (int i=0; i < intRow; i++){
        Matric [i] = new int [intColum];
        for (int j=0; j < intColum; j++){
            Matric [i][j] = 1 + rand()%100;
        }
    }
 
for (int j=0; j < intColum; j++)
    quicksort_colum(Matric, j, 0, intRow-1);
Добавлено через 6 минут
Цитата Сообщение от Тамика Посмотреть сообщение
Проверяете номер стоблца на четность. о_О

Добавлено через 43 секунды
А если нужно все чётные в одну сортировку - в отдельный массив и сортируем.
нет, надо выполнить сортировку не четных столбцов, а элементов столбцов, стоящих на четных позициях в столбцах.
0
Zazy
45 / 45 / 15
Регистрация: 14.04.2013
Сообщений: 186
24.11.2014, 17:50 #5
Цитата Сообщение от Galateo Посмотреть сообщение
нет, надо выполнить сортировку не четных столбцов, а элементов столбцов, стоящих на четных позициях в столбцах.
Щито ? оО
0
Galateo
0 / 0 / 0
Регистрация: 27.12.2013
Сообщений: 9
24.11.2014, 17:59  [ТС] #6
Цитата Сообщение от Zazy Посмотреть сообщение
Щито ? оО
дана матрица:
23 45
34 56
12 23
50 89
67 89
78 90
98 13
34 99

должна получиться:
23 45
78 99
12 23
50 90
67 89
34 89
98 13
34 56
0
Тамика
Котовчанин
917 / 461 / 145
Регистрация: 16.02.2010
Сообщений: 3,229
Записей в блоге: 27
24.11.2014, 18:00 #7
Цитата Сообщение от Galateo Посмотреть сообщение
должна получиться:
Так а где ж тут отсортировано-то?..
0
Galateo
0 / 0 / 0
Регистрация: 27.12.2013
Сообщений: 9
24.11.2014, 18:08  [ТС] #8
Цитата Сообщение от Тамика Посмотреть сообщение
Так а где ж тут отсортировано-то?..
по убыванию отсортированы элементы, стоящие на четных местах.

Добавлено через 1 минуту
т.е. был массив
34 50 78 34
стал
78 50 34 34

то же самое со вторым столбцом
0
Тамика
Котовчанин
917 / 461 / 145
Регистрация: 16.02.2010
Сообщений: 3,229
Записей в блоге: 27
24.11.2014, 18:22 #9
Цитата Сообщение от Galateo Посмотреть сообщение
по убыванию отсортированы элементы, стоящие на четных местах.
Аааа, понятно. В каждом столбце отсортировать элементы на четных позициях?
0
Galateo
0 / 0 / 0
Регистрация: 27.12.2013
Сообщений: 9
24.11.2014, 18:35  [ТС] #10
Цитата Сообщение от Тамика Посмотреть сообщение
Аааа, понятно. В каждом столбце отсортировать элементы на четных позициях?
да, верно
0
Zazy
45 / 45 / 15
Регистрация: 14.04.2013
Сообщений: 186
24.11.2014, 22:27 #11
Форматирование сами попробуйте прикрутить.
Кликните здесь для просмотра всего текста
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
#include <iostream>
#include <ctime>
#include <cstdlib>
 
void print_matrix(int **matrix, const int SIZE);
void quicksort(int *arr, int first, int last);
void matrix_inner(int **matrix, const int SIZE);
 
using namespace std;
 
int main()
{
    int SIZE = 0;
    cout << "Enter size matrix: ";
    cin >> SIZE;
    
    int **matrix = new int*[SIZE];
    for (int i = 0; i < SIZE; i++)
        matrix[i] = new int[SIZE];
    srand(time(NULL));
    
    for (int i = 0; i < SIZE; i++)
        for (int j = 0; j < SIZE; j++)
            matrix[i][j] = rand() % 100;
    cout << "Source matrix.\n";
    print_matrix(matrix, SIZE);
    cout << "==============\n";
    cout << "Sorted matrix.\n";
    matrix_inner(matrix, SIZE);
    print_matrix(matrix, SIZE);
 
 
    for (int i = 0; i < SIZE; i++)
        delete[]matrix[i];
    delete[]matrix;
    system("pause");
    return 0;
 
}
 
void print_matrix(int **matrix, const int SIZE)
{
    for (int i = 0; i < SIZE; i++)
    {
        for (int j = 0; j < SIZE; j++)
            cout << matrix[i][j] << ' ';
        cout << endl;
    }
}
 
void matrix_inner(int **matrix, const int SIZE)
{
  int ttt = SIZE / 2;
    int * temp_arr = new int[ttt];
    for (int i = 0; i < SIZE; i++)
    {
      for (int j = 0; j < SIZE; j++)
            if ((j + 1) % 2 == 0)
                temp_arr[j / 2] = matrix[j][i];
 
      quicksort(temp_arr, 0, SIZE / 2 - 1);
          
      for (int l = 0; l < SIZE; l++)
            if ((l + 1) % 2 == 0)
                matrix[l][i] = temp_arr[l/2];
    }
    delete[] temp_arr;
}
 
void quicksort(int *arr, int first, int last)
{
    int mid, count;
    int f = first, l = last;
    mid = arr[l / 2];
    do
    {
        while (arr[f]>mid) f++;
        while (arr[l]<mid) l--;
        if (f <= l)
        {
            count = arr[f];
            arr[f] = arr[l];
            arr[l] = count;
            f--;
            l++;
        }
    } while (f >= l);
    if (first>l) quicksort(arr, f, last);
    if (f>last) quicksort(arr, first, l);
}
1
Миниатюры
Быстрая сортировка элементов столбцов двумерного массива, стоящих на четных позициях  
Galateo
0 / 0 / 0
Регистрация: 27.12.2013
Сообщений: 9
26.11.2014, 22:55  [ТС] #12
Цитата Сообщение от Zazy Посмотреть сообщение
Форматирование сами попробуйте прикрутить.
Кликните здесь для просмотра всего текста
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
#include <iostream>
#include <ctime>
#include <cstdlib>
 
void print_matrix(int **matrix, const int SIZE);
void quicksort(int *arr, int first, int last);
void matrix_inner(int **matrix, const int SIZE);
 
using namespace std;
 
int main()
{
    int SIZE = 0;
    cout << "Enter size matrix: ";
    cin >> SIZE;
    
    int **matrix = new int*[SIZE];
    for (int i = 0; i < SIZE; i++)
        matrix[i] = new int[SIZE];
    srand(time(NULL));
    
    for (int i = 0; i < SIZE; i++)
        for (int j = 0; j < SIZE; j++)
            matrix[i][j] = rand() % 100;
    cout << "Source matrix.\n";
    print_matrix(matrix, SIZE);
    cout << "==============\n";
    cout << "Sorted matrix.\n";
    matrix_inner(matrix, SIZE);
    print_matrix(matrix, SIZE);
 
 
    for (int i = 0; i < SIZE; i++)
        delete[]matrix[i];
    delete[]matrix;
    system("pause");
    return 0;
 
}
 
void print_matrix(int **matrix, const int SIZE)
{
    for (int i = 0; i < SIZE; i++)
    {
        for (int j = 0; j < SIZE; j++)
            cout << matrix[i][j] << ' ';
        cout << endl;
    }
}
 
void matrix_inner(int **matrix, const int SIZE)
{
  int ttt = SIZE / 2;
    int * temp_arr = new int[ttt];
    for (int i = 0; i < SIZE; i++)
    {
      for (int j = 0; j < SIZE; j++)
            if ((j + 1) % 2 == 0)
                temp_arr[j / 2] = matrix[j][i];
 
      quicksort(temp_arr, 0, SIZE / 2 - 1);
          
      for (int l = 0; l < SIZE; l++)
            if ((l + 1) % 2 == 0)
                matrix[l][i] = temp_arr[l/2];
    }
    delete[] temp_arr;
}
 
void quicksort(int *arr, int first, int last)
{
    int mid, count;
    int f = first, l = last;
    mid = arr[l / 2];
    do
    {
        while (arr[f]>mid) f++;
        while (arr[l]<mid) l--;
        if (f <= l)
        {
            count = arr[f];
            arr[f] = arr[l];
            arr[l] = count;
            f--;
            l++;
        }
    } while (f >= l);
    if (first>l) quicksort(arr, f, last);
    if (f>last) quicksort(arr, first, l);
}
спасибо большое

только в самой функции быстрой сортировки ошибка:
формула для компоранда, т.е. среднего элемента, следующая:
mid = arr[(f + l) / 2];
0
Zazy
45 / 45 / 15
Регистрация: 14.04.2013
Сообщений: 186
27.11.2014, 01:01 #13
arr[(f + l) / 2] нахождение опорного элемента, f - начало, l - конец , в данном случае сортировка всегда будет с начала т.е. f = 0 и смысла в нем нету.
0
Galateo
0 / 0 / 0
Регистрация: 27.12.2013
Сообщений: 9
27.11.2014, 23:05  [ТС] #14
Цитата Сообщение от Zazy Посмотреть сообщение
arr[(f + l) / 2] нахождение опорного элемента, f - начало, l - конец , в данном случае сортировка всегда будет с начала т.е. f = 0 и смысла в нем нету.
а как же рекурсивная функция, в которую в качестве аргумента first передается измененное значение f?
ведь это f далеко не равно нулю.
C++
1
if (first>l) quicksort(arr, f, last);
Добавлено через 11 минут
и да, я немного не понимаю еще одно место.
как l, т.е. правый, или последний индекс, может быть меньше первого first?
условие first>l никогда не будет истинным, и данная рекурсивная функция quicksort(arr, f, last) не выполнится..
объясните этот момент, пожалуйста
0
27.11.2014, 23:05
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.11.2014, 23:05
Привет! Вот еще темы с ответами:

Не работает быстрая сортировка для двумерного массива - C++
Здравствуйте, возникла проблема, не работает быстрая сортировка по возрастанию абсолютных величин для двумерного массива. Работает только,...

Найти сумму четных элементов массива, стоящих на четных местах - C++
Вы моя последняя надежда( помогите пожалуйста)) прогу с комментариями... 1. Найти сумму четных элементов массива, стоящих на четных...

Подсчитать сумму цифр числа, стоящих на четных позициях - C++
Задача 2. Ввести с экрана натуральное пятизначное число. Подсчитать сумму цифр числа, стоящих на четных позициях. Протестировать программу ...

Вычислить и вывести произведение первых 7 элементов массива и сумму следующих 7 элементов находящихся на четных позициях - C++
Дан одномерный массив T, который состоит из 18 элементов. Вычислить и вывести произведение первых 7 элементов и сумму следующих 7 элементов...


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

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

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