0 / 0 / 0
Регистрация: 04.07.2018
Сообщений: 55
1

Методы сортировки статических и динамических массивов

05.07.2018, 22:33. Показов 3154. Ответов 10

Наверное, самая тяжёлая работа, с которой пришлось столкнуться...
Как это делать?
Нужно вариант для одномерных статистических и вариант для двумерных динамических
Используя технологию процедурного программирования реализовать заданный метод сортировки и применить его для указанных фрагментов числовой матрицы в соответствии с индивидуальным заданием.

.Сортировка по возрастанию методом обмена с флагом перестановки.

Исходная матрица, содержащая 2*n строк и 2*n столбцов, не должна содержать элементов с одинаковыми и нулевыми значениями. Значения элементов матрицы необходимо формировать программно (с клавиатуры не вводить) с помощью формул.
У результирующей матрицы должны быть отсортированы заданные фрагменты, а значения элементов не сортируемых фрагментов должны быть обнулены.
Выходные данные должны выводиться на экран с пояснениями.
Использовать стандартные потоковые объекты ввода/вывода cin и cout.

На картинке область сортировки матрицы
Изображения
 
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
05.07.2018, 22:33
Ответы с готовыми решениями:

Вывести эдементы матрицы с помощью статических и динамических массивов
помогите, пожалуйста, как написать код в с++. Дана матрица размера A * B. Вывести ее элементы в...

Основные методы сортировки массивов
помогите пожалуйста(( я не могу решить вот такую вот задачу(( Выполнить сортировку по убыванию....

Методы сортировки массивов.Метод пузырьковый
Метод пузырьковый nLeft 600 nRight 1600 Помогите сделать Зарание Благодарю.

Передача через нетипизированный параметр как динамических, так и статических (разного объёма) массивов
Необходимо написать процедуру, способную выводить двумерные динамические и статические массивы...

10
LegionK
06.07.2018, 07:59
  #2

Не по теме:

Цитата Сообщение от Студент_прогер Посмотреть сообщение
.Сортировка по возрастанию методом обмена с флагом перестановки.
Гугл ничего не выдал. Это какой-то вид пузырьковой сортировки? Тогда расскажите,пожалуйста, зачем нужен ваш "флаг перестановки"

0
0 / 0 / 0
Регистрация: 04.07.2018
Сообщений: 55
06.07.2018, 09:18  [ТС] 3
Я не знаю даже, в задании так сказано, можно и другим методом
. Сортировка по убыванию методом выбора минимума.
0
7424 / 5019 / 2890
Регистрация: 18.12.2017
Сообщений: 15,694
06.07.2018, 15:50 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
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
#include <iostream>
#include <ctime>
using namespace std;
 
void Set(double x[], int N)
{
    for (int i = 0; i < N; i++)
      {
      if (i%2==0) x[i]=i+N+3;
      else x[i]=i-N-3;      
      }
}
 
void Print (double x[], int N)
{
    for (int i = 0; i < N; i++)     
      cout <<x[i]<<" ";      
    cout <<endl;
}
 
void BubbleFlag (double x[], int N)
{
    bool flag = true;
            do
            {
                flag = false;
                for(int i = 0; i < N - 1; i++)
                {
                    if(x[i+1]<x[i])
                    {
                        swap(x[i], x[i+1]);
                        flag = true;                        
                    }
                }
            } while(flag);
}
 
int main()
{
    srand((int)time(0));
    const int n=12;    
 
    double a[n];
    
    Set(a, n);
    Print (a, n);
    BubbleFlag (a, n); 
    Print (a, n);
system("pause");
return 0;
}
для фрагмента двумерной попробуйте сделать самостоятельно по такому же принципу. не получится - сообщите.
0
0 / 0 / 0
Регистрация: 04.07.2018
Сообщений: 55
15.08.2018, 12:23  [ТС] 5
Спасибо, а не могли бы вы включить в программу комментарии для ясности?
0
4004 / 3265 / 914
Регистрация: 25.03.2012
Сообщений: 12,194
Записей в блоге: 1
15.08.2018, 20:04 6
Студент_прогер, это самый обычный пузырёк. Какое место в нём не понятно? Говори конкретно.
0
0 / 0 / 0
Регистрация: 04.07.2018
Сообщений: 55
29.08.2018, 00:06  [ТС] 7
Здесь всё получилось, спасибо. помогите, пожалуйста, сделать 2-ое задание
0
0 / 0 / 0
Регистрация: 04.07.2018
Сообщений: 55
31.08.2018, 14:38  [ТС] 8
где ошибки?
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
//Методы сортировки
//Массивы динамические двумерные
//Сортировка элементов всех строк двумерного массива целых чисел
//по убыванию
 
#include<iostream>
#include <locale.h>
using namespace std;
 
typedef telem tmas[RAZ][RAZ]  ; //определение типа массива
typedef int telem ;     //определение типа элементов массива
typedef telem *tstr ;   //определение типа "указатель на telem"
typedef tstr *tmatr;    //определение типа "указатель на указатель на telem"
void inputmatr(tmatr a) ;
void outputmatr(tmatr a) ;
void sort_obmenF(tmatr a) ;
 
 
int main()
{ int i, j ;
  tmas mas [6][6] = {1,8,12,4,7,9,11,3,17,18,6,5,19,2,10,13,16,14,20,15,23,26,33,36,24,35,21,22,25,27,30,29,31,28,32,34};
  tmatr a;      //объявляется переменная-указатель на указатель на telem
  setlocale(LC_ALL,"Russian") ;
    a = new tstr [6] ;  //выделение динамической памяти под массив
                    //указателей на строки массива
  for(i = 0; i < 6; i++)    //цикл выделения памяти под каждую строку
     *(a + i) = new telem [6] ;//каждому элементу массива указателей
                         //на строки присваивается адрес начала
                         //области памяти, выделяемой под строку
 
  outputmatr(a) ;
  sort_obmenF(a) ;
  cout << "Матрица с отсортированными строками:" << endl ;
  outputmatr(a) ;
  cout << endl ;
//Освобождение динамической памяти
  for(i = 0; i < 6; i++)
     delete a[i] ;
  delete a ;
  return 0 ;
}
 
//сортировка элементов массива по возрастанию методом обмена с флагом
void sort_obmenF(tmatr a)
{ int i, j, k, flag ;
  telem z ;
  for(i = 0 ; i < 3 ; i++)
     {k = 3 ;   //начальное количество не сортированных элементов строки
      do{flag = 0 ;
     for(j = k - (i + 1) ; j < k + i ; j++)
        if(*(*(a + i) + j) < *(*(a + i) + j + 1))
          {z = *(*(a + i) + j) ;
           *(*(a + i) + j) = *(*(a + i) + j + 1);
           *(*(a + i) + j + 1) = z ;
           flag = 1 ;
          }
     k-- ;
    }while(flag);
     }
  for(i = 3 ; i < 6 ; i++)
     {k = 3 ;   //начальное количество не сортированных элементов строки
      do{flag = 0 ;
     for(j = k + i ; j < k - (i + 1) ; j++)
        if(*(*(a + i) + j) < *(*(a + i) + j + 1))
          {z = *(*(a + i) + j) ;
           *(*(a + i) + j) = *(*(a + i) + j + 1);
           *(*(a + i) + j + 1) = z ;
           flag = 1 ;
          }
     k-- ;
    }while(flag);
     }
 
}
void outputmatr(tmatr a)
{ int i, j ;
  for(i = 0; i < 6; i++)
     {for(j = 0; j < 6; j++)
     {cout.width(2) ;   //ширина поля выводимого параметра
      cout << *(*(a + i) + j) << ' ' ;
     }
      cout << '\n';
     }
}
Добавлено через 4 часа 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
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
//Методы сортировки
//Массивы динамические двумерные
//Сортировка элементов всех строк двумерного массива целых чисел
//по убыванию
 
#include<iostream>
#include <locale.h>
using namespace std;
    
typedef int telem ;     //определение типа элементов массива
typedef telem *tstr ;   //определение типа "указатель на telem"
typedef tstr *tmatr;    //определение типа "указатель на указатель на telem"
void inputmatr(tmatr a, int n, int m) ;
void outputmatr(tmatr a, int n, int m) ;
void sort_obmenF(tmatr a, int n, int m) ;
 
 
int main()
{ int i, j ;
  int n ;       //число строк матрицы
  int m ;       //число столбцов матрицы
  tmatr a;      //объявляется переменная-указатель на указатель на telem
  setlocale(LC_ALL,"Russian") ;
  cout << "\nВведите количество строк и столбцов матрицы: " ;
  cin >> n >> m;
  a = new tstr [n] ;    //выделение динамической памяти под массив
                    //указателей на строки массива
  for(i = 0; i < n; i++)    //цикл выделения памяти под каждую строку
     *(a + i) = new telem [m] ;//каждому элементу массива указателей
                         //на строки присваивается адрес начала
                         //области памяти, выделяемой под строку
  inputmatr(a, n, m) ;
  cout << "Исходная матрица:\n" ;
  outputmatr(a, n, m) ;
  sort_obmenF(a, n, m) ;
  cout << "Матрица с отсортированными строками:" << endl ;
  outputmatr(a, n, m) ;
  cout << endl ;
//Освобождение динамической памяти
  for(i = 0; i < n; i++)
     delete a[i] ;
  delete a ;
  return 0 ;
}
 
 
 
void inputmatr(tmatr a, int n, int m)
{ 
  for(int i = 0 ; i < n ; i++)
     for(int j = 0 ; j < m ; j++)
     *(*(a + i) + j) = 10 * i + j;
 
}
//сортировка элементов массива по возрастанию методом обмена с флагом
void sort_obmenF(tmatr a, int n, int m)
{ int i, j, k, flag ;
  telem z ;
  for(i = 0 ; i < n/2 ; i++)
     {k = m/2 ; //начальное количество не сортированных элементов строки
      do{flag = 0 ;
     for(j = k - (i + 1) ; j < k + i ; j++)
        if(*(*(a + i) + j) < *(*(a + i) + j + 1))
          {z = *(*(a + i) + j) ;
           *(*(a + i) + j) = *(*(a + i) + j + 1);
           *(*(a + i) + j + 1) = z ;
           flag = 1 ;
          };
       for(j = 0 ; j < k - (i + 2) ; j++)
          *(*(a + i) + j)=0;
       for(j = k + i + 1 ; j < 2*k - 1 ; j++)
          *(*(a + i) + j)=0;
 
     k-- ;
    }while(flag);
     }
  for(i = n/2 ; i < n ; i++)
     {k = m/2 ; //начальное количество не сортированных элементов строки
      do{flag = 0 ;
     for(j = k + i ; j < k - (i + 1) ; j++)
        if(*(*(a + i) + j) < *(*(a + i) + j + 1))
          {z = *(*(a + i) + j) ;
           *(*(a + i) + j) = *(*(a + i) + j + 1);
           *(*(a + i) + j + 1) = z ;
           flag = 1 ;
          };
       for(j = 0 ; j < k + i + 1; j++)
          *(*(a + i) + j)=0;
       for(j = k - (i + 2); j < 2*k - 1 ; j++)
          *(*(a + i) + j)=0;
 
     k-- ;
    }while(flag);
    }
 
}
void outputmatr(tmatr a, int n, int m)
{ int i, j ;
  for(i = 0; i < n; i++)
     {for(j = 0; j < m; j++)
     {cout.width(2) ;   //ширина поля выводимого параметра
      cout << *(*(a + i) + j) << ' ' ;
     }
      cout << '\n';
     }
}
0
0 / 0 / 0
Регистрация: 04.07.2018
Сообщений: 55
18.09.2018, 22:46  [ТС] 9
Помогите, пожалуйста, где-то ошибки и я не могу понять где
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
//Методы сортировки
//Массивы динамические двумерные
//Сортировка указанных строк двумерного массива целых чисел
//по возрастанию методом обмена с флагом перестановки
 
#include<iostream>
#include <locale.h>
using namespace std;
 
typedef int telem ;     //определение типа элементов массива
typedef telem *tstr ;   //определение типа "указатель на telem"
typedef tstr *tmatr;    //определение типа "указатель на указатель на telem"
void inputmatr(tmatr a, int n, int m) ;
void outputmatr(tmatr a, int n, int m) ;
void sort_obmenF(tmatr a, int n, int m) ;
 
 
int main()
{ int i, j ;
  int n ;       //число строк матрицы
  int m ;       //число столбцов матрицы
  tmatr a;      //объявляется переменная-указатель на указатель на telem
  setlocale(LC_ALL,"Russian") ;
  cout << "\nВведите количество строк и столбцов матрицы: " ;
  cin >> n >> m;
  a = new tstr [n] ;    //выделение динамической памяти под массив
                    //указателей на строки массива
  for(i = 0; i < n; i++)    //цикл выделения памяти под каждую строку
     *(a + i) = new telem [m] ;//каждому элементу массива указателей
                         //на строки присваивается адрес начала
                         //области памяти, выделяемой под строку
  inputmatr(a, n, m) ;
  cout << "Исходная матрица:\n" ;
  outputmatr(a, n, m) ;
  sort_obmenF(a, n, m) ;
  cout << "Матрица с отсортированными строками:" << endl ;
  outputmatr(a, n, m) ;
  cout << endl ;
//Освобождение динамической памяти
  for(i = 0; i < n; i++)
     delete a[i] ;
  delete a ;
  return 0 ;
}
void inputmatr(tmatr a, int n, int m)
{ 
  for(int i = 0 ; i < n ; i++)
     for(int j = 0 ; j < m ; j++)
     *(*(a + i) + j) = 10 * i + j;
}
 
//сортировка элементов массива по возрастанию методом обмена с флагом
void sort_obmenF(tmatr a, int n, int m)
{ int i, j, k, flag ;
  telem z ;
  for(i = 0 ; i < n/2 ; i++)
     {k = m/2 ; //начальное количество не сортированных элементов строки
      do{flag = 0 ;
     for(j = k - (i + 1) ; j < k + i ; j++)
        if(*(*(a + i) + j) < *(*(a + i) + j + 1))
          {z = *(*(a + i) + j) ;
           *(*(a + i) + j) = *(*(a + i) + j + 1);
           *(*(a + i) + j + 1) = z ;
           flag = 1 ;
          }  
     k-- ;
    }while(flag);
       for(j = 0 ; j < k - (i + 2) ; j++)
          {*(*(a + i) + j)=0;
          };
       for(j = k + i + 1 ; j < 2*k - 1 ; j++)
          {*(*(a + i) + j)=0;
          };
     }
  for(i = n/2 ; i < n ; i++)
     {k = m/2 ; //начальное количество не сортированных элементов строки
      do{flag = 0 ;
     for(j = k + i ; j < k - (i + 1) ; j++)
        if(*(*(a + i) + j) < *(*(a + i) + j + 1))
          {z = *(*(a + i) + j) ;
           *(*(a + i) + j) = *(*(a + i) + j + 1);
           *(*(a + i) + j + 1) = z ;
           flag = 1 ;
          }
     k-- ;
    }while(flag);
       for(j = 0 ; j < k + i + 1; j++)
          {*(*(a + i) + j)=0;
          };
       for(j = k - (i + 2); j < 2*k - 1 ; j++)
          {*(*(a + i) + j)=0;
          };
 
    }
 
}
void outputmatr(tmatr a, int n, int m)
{ int i, j ;
  for(i = 0; i < 6; i++)
     {for(j = 0; j < 6; j++)
     {cout.width(2) ;   //ширина поля выводимого параметра
      cout << *(*(a + i) + j) << ' ' ;
     }
      cout << '\n';
     }
}
0
4004 / 3265 / 914
Регистрация: 25.03.2012
Сообщений: 12,194
Записей в блоге: 1
19.09.2018, 10:34 10
Студент_прогер,
C++
1
2
3
4
5
6
void outputmatr(tmatr a, int n, int m)
{
    int i, j;
    for (i = 0; i < 6; i++)
    {
        for (j = 0; j < 6; j++)
Ну дык ты 6 на 6 всегда выводишь, а проверяешь очевидно программу с матрицами различного размера, n на m, особенно меньшего чем 6 на 6!
0
0 / 0 / 0
Регистрация: 04.07.2018
Сообщений: 55
21.09.2018, 17:37  [ТС] 11
Как же это исправить?
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
21.09.2018, 17:37
Помогаю со студенческими работами здесь

Реализация основных алгоритмов сортировки динамических массивов
Массив заполняется произвольно. Количество элементов массива произвольное (не менее 10 для...

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

Реализовать программу, объединяющую простейшие методы сортировки массивов
Реализовать программу, объединяющую простейшие методы сортировки массивов: • сортировку обменом...

Написать программу, в которой реализуются различные методы сортировки массивов
Здравствуйте! Да, тема сортировка массивов, но не всё так просто. Получил такое задание: Написать...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru