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

Сортировка выбором (направление сортировки запросить у пользователя)

12.02.2019, 02:35. Показов 2431. Ответов 16

Author24 — интернет-сервис помощи студентам
Здравствуйте, мне нужно выполнить программную реализацию алгоритма сортировки выбором; и при этом способ сортировки (по убыванию или по возрастанию) запрашивать у пользователя. Как это можно сделать?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
12.02.2019, 02:35
Ответы с готовыми решениями:

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

Алгоритм сортировки выбором данных: простой выбор, пирамидальная сортировка
Помогите кто нить !)) мот у кого есть какие нить исходники?) я там и сам доделаю. начало просто...

Случай когда сортировка обменами эффективней сортировки выбором на малом массиве
Здравствуйте, возможно ли привести последовательность на массиве из 5 чисел, когда сортировка...

Отличие сортировки выбором от сортировки прямым выбором
Препод задала вопрос, на который я не могу найти инфу в инете, если знаете, подскажите. Но нужно...

16
447 / 333 / 172
Регистрация: 01.07.2015
Сообщений: 1,162
12.02.2019, 03:47 2
Функция + соответствующий компаратор:

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
template <typename Comparator>
void selection_sort(vector<int>& a, Comparator comp) {
  for (size_t i = 0; i < a.size() - 1; i++) {
    size_t min_idx = i;
 
    for (size_t j = i + 1; j < a.size(); j++) {
      if (comp(a[j], a[min_idx]))
        min_idx = j;
    }
 
    if (min_idx != i) {
      swap(a[i], a[min_idx]);
 
      min_idx = i;
    }
  }
}
 
//где-то в коде:
 
selection_sort(a, [](const auto& a, const auto& b) {
  return a < b;
  // return a > b;
});
0
0 / 0 / 0
Регистрация: 06.12.2016
Сообщений: 33
12.02.2019, 04:01  [ТС] 3
А если без использования функции?
0
447 / 333 / 172
Регистрация: 01.07.2015
Сообщений: 1,162
12.02.2019, 04:07 4
Цитата Сообщение от kolyasik583 Посмотреть сообщение
А если без использования функции?
два цикла. В зависимости от выбора пользователя вызывать соответствующий

C++
1
2
3
4
5
6
7
8
cout << "type: ";
cin type;
 
if (type == 1) {
  // по убыванию...
} else {
  // по возрастанию...
}
0
0 / 0 / 0
Регистрация: 06.12.2016
Сообщений: 33
12.02.2019, 04:13  [ТС] 5
А можно поподробнее?

Добавлено через 1 минуту
И компараторы мы тоже еще не проходили(
0
447 / 333 / 172
Регистрация: 01.07.2015
Сообщений: 1,162
12.02.2019, 04:24 6
Цитата Сообщение от kolyasik583 Посмотреть сообщение
И компараторы мы тоже еще не проходили(
Компаратор - булева функция, возвращающая true или false

Цитата Сообщение от kolyasik583 Посмотреть сообщение
А можно поподробнее?
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
int n;
cin >> n;
 
vector<int> a(n);
for (auto& i : a)
  cin >> i;
 
int type;
cin >> type;
 
if (type == 1) {
  for (size_t i = 0; i < a.size() - 1; i++) {
    size_t min_idx = i;
 
    for (size_t j = i + 1; j < a.size(); j++) {
      if (a[j] < a[min_idx])
        min_idx = j;
    }
 
    if (min_idx != i) {
      swap(a[i], a[min_idx]);
 
      min_idx = i;
    }
  }
} else {
  for (size_t i = 0; i < a.size() - 1; i++) {
    size_t min_idx = i;
 
    for (size_t j = i + 1; j < a.size(); j++) {
      if (a[j] > a[min_idx])
        min_idx = j;
    }
 
    if (min_idx != i) {
      swap(a[i], a[min_idx]);
 
      min_idx = i;
    }
  }
}
 
copy(a.cbegin(), a.cend(), ostream_iterator<int>(cout, " "));
0
0 / 0 / 0
Регистрация: 06.12.2016
Сообщений: 33
12.02.2019, 04:27  [ТС] 7
Спасибо вам большое, а как сделать это без использование векторов?
0
447 / 333 / 172
Регистрация: 01.07.2015
Сообщений: 1,162
12.02.2019, 04:28 8
Цитата Сообщение от kolyasik583 Посмотреть сообщение
Спасибо вам большое, а как сделать это без использование векторов?
Заменить на динамический:

C++
1
int* a = new int[n];
Все упоминания a.size() на n
0
0 / 0 / 0
Регистрация: 06.12.2016
Сообщений: 33
12.02.2019, 04:31  [ТС] 9
А если делать это без указателя, только используя массив
0
447 / 333 / 172
Регистрация: 01.07.2015
Сообщений: 1,162
12.02.2019, 04:34 10
Цитата Сообщение от kolyasik583 Посмотреть сообщение
А если делать это без указателя, только используя массив
Используйте статический массив
0
0 / 0 / 0
Регистрация: 06.12.2016
Сообщений: 33
12.02.2019, 04:35  [ТС] 11
А можете написать код если не сложно, вы итак очень помогли.
0
447 / 333 / 172
Регистрация: 01.07.2015
Сообщений: 1,162
12.02.2019, 04:41 12
Цитата Сообщение от kolyasik583 Посмотреть сообщение
А можете написать код если не сложно, вы итак очень помогли.
C++
1
2
3
4
const int n = 10;
int a[n];
for (int i = 0; i < n; ++i)
  cin >> a[i];
0
0 / 0 / 0
Регистрация: 06.12.2016
Сообщений: 33
12.02.2019, 04:43  [ТС] 13
Я просто не понимаю как сделать саму сортировку выбором
0
447 / 333 / 172
Регистрация: 01.07.2015
Сообщений: 1,162
12.02.2019, 04:53 14
kolyasik583, в первом коде подключите соответствующие инклюды, напишите main, сделайте изменения, которые я сказал, и код готов

Добавлено через 3 минуты
в коде, который был в 5:24, если быть точным, а не в первом
0
7437 / 5029 / 2892
Регистрация: 18.12.2017
Сообщений: 15,692
12.02.2019, 05:10 15
ReDoX, а if-else нельзя только на строку 16 поставить ?
1
447 / 333 / 172
Регистрация: 01.07.2015
Сообщений: 1,162
12.02.2019, 05:16 16
Yetty, можно, но мне проще думать в духе компаратора, поэтому я скопировал два раза код. Если автору нужно:

C++
1
2
if ((type == 1 && a[j] < a[min_idx]) || (type == 2 && a[j] > a[min_idx]))
  min_idx = i;
1
7437 / 5029 / 2892
Регистрация: 18.12.2017
Сообщений: 15,692
12.02.2019, 05:57 17
kolyasik583, так не совсем под условие, но как вариант:
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>
#include <cstdlib>
#include <ctime>
using namespace std;
 
int main()
{
    srand((int)time(0));
    int n, k;
    cout <<"n="; cin >>n;
 
    double*a = new double[n];
 
    for (int i = 0; i < n; i++)
      {
      a[i]=rand()%9 + 1;
      cout <<a[i]<<" ";
      }
    cout <<"\n";
    
    cout << "Make choice: 1 - up, 2 - down: "; cin >> k;
 
    double tmp;
    for(int i = 0; i < n; ++i) 
    { 
        int pos = i; 
        tmp = a[i];
        for(int j = i + 1; j < n; ++j) 
        {
            if (a[j] < tmp) 
           {
               pos = j; 
               tmp = a[j]; 
           }          
        }
        a[pos] = a[i]; 
        a[i] = tmp; 
    }
    
    if (k==2)
    for (int i = 0; i < n/2; i++)    
    swap (a[i], a[n-1-i]);
    
    for (int i = 0; i < n; i++)      
      cout <<a[i]<<" ";      
    cout <<"\n";
    delete[]a;
system("pause");
return 0;
}
доработайте сами - поставьте 2 блока сортировки (по убыванию и возрастанию) или используйте вариант приведённый выше. реверс уберите. для выбора можете применить switch.

Добавлено через 13 минут
наверное мы Вас совсем запутали вот, держите:
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
#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;
 
int main()
{
    srand((int)time(0));
    int n, k;
    cout <<"n="; cin >>n;
 
    double*a = new double[n];
 
    for (int i = 0; i < n; i++)
      {
      a[i]=rand()%9 + 1;
      cout <<a[i]<<" ";
      }
    cout <<"\n";
    
    cout << "Make choice: 1 - up, 2 - down: "; cin >> k;
 
    double tmp;
    for(int i = 0; i < n; ++i) 
    { 
        int pos = i; 
        tmp = a[i];
        for(int j = i + 1; j < n; ++j) 
        {
            if ((k==1 && a[j] < tmp) || (k==2 && a[j] > tmp)) 
           {
               pos = j; 
               tmp = a[j]; 
           }          
        }
        a[pos] = a[i]; 
        a[i] = tmp; 
    }    
    
    for (int i = 0; i < n; i++)      
      cout <<a[i]<<" ";      
    cout <<"\n";
    delete[]a;
system("pause");
return 0;
}
0
12.02.2019, 05:57
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
12.02.2019, 05:57
Помогаю со студенческими работами здесь

Расставить элементы массива в порядке возрастания методом сортировки выбором и сортировки простыми вставками
Здрасьте еще раз!С прошедшим вас праздником! я глупая и бестолковая опять пришла к вам на...

Направление сортировки массива
Создать функцию сортировки массива где кроме поля по которому выполняется сортировка передаётся...

Как запросить у пользователя массив
Помогите,как сделать чтобы программа запрашивала у пользователя масив из 10 целых чисел,вывела на...

Запросить имя и поприветствовать пользователя
Напишите программу, которая запрашивает ваше имя и приветствует вас. Для ввода имени используйте...


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

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