Форум программистов, компьютерный форум CyberForum.ru

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

Войти
Регистрация
Восстановить пароль
 
tasik
0 / 0 / 0
Регистрация: 27.12.2012
Сообщений: 52
#1

Нужно отсортировать одномерный масив - C++

15.10.2013, 09:51. Просмотров 398. Ответов 11
Метки нет (Все метки)

Преобразовать массив таким образом, чтобы сначала располагались все элементы, отличающиеся от максимального не более чем на 20%, а затем - все остальные.

Максимальный елемент нашол!
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Folko
265 / 253 / 7
Регистрация: 27.09.2013
Сообщений: 877
Записей в блоге: 1
15.10.2013, 10:01     Нужно отсортировать одномерный масив #2
tasik, не уверен что хорошее решение, но заводим дополнительную переменную, которая показывает количество перемещенных элементов и сделать нечто вроде:
C++
1
2
3
4
5
6
7
int t = -1;
for (int i=0;i<n;i++)
     if (abs(array[i]) - array[max]) <= abs(array[max]*0.2)
     {
          t++;
          swap(array[t],array[i]);
     }
при таком способе остальные значения располагаются не в исходном порядке
MrGluck
Ворчун
Эксперт CЭксперт С++
6625 / 3816 / 500
Регистрация: 29.11.2010
Сообщений: 10,072
15.10.2013, 10:11     Нужно отсортировать одномерный масив #3
По сути, если нет ограничений в виде сохранения упорядоченности, то можно просто отсортировать по убыванию
tasik
0 / 0 / 0
Регистрация: 27.12.2012
Сообщений: 52
15.10.2013, 10:13  [ТС]     Нужно отсортировать одномерный масив #4
Функцию swap самому написать или стандартная?
SatanaXIII
Супер-модератор
Эксперт С++
5589 / 2623 / 239
Регистрация: 01.11.2011
Сообщений: 6,448
Завершенные тесты: 1
15.10.2013, 10:18     Нужно отсортировать одномерный масив #5
Цитата Сообщение от tasik Посмотреть сообщение
отличающиеся от максимального не более чем на 20%
Цитата Сообщение от tasik Посмотреть сообщение
а затем - все остальные
Что первые, что вторые - как должны располагаться между собой?
kamre
126 / 130 / 4
Регистрация: 25.12.2011
Сообщений: 443
15.10.2013, 10:18     Нужно отсортировать одномерный масив #6
Цитата Сообщение от tasik Посмотреть сообщение
чтобы сначала располагались все элементы, отличающиеся от максимального не более чем на 20%, а затем - все остальные
Вроде же все тривиально:
C++
1
2
3
4
5
6
7
8
9
10
11
12
#include <algorithm>
#include <iostream>
 
using namespace std;
 
int main() {
  int a[] = { 50, 95, 15, 13, 35, 75, 80, 90, 100, 40 };
  int max = *max_element(begin(a), end(a));
  stable_partition(begin(a), end(a), [=](int i) { return abs(i - max) <= 0.2*abs(max); });
  for (int i : a)
    cout << i << ", ";
}
95, 80, 90, 100, 50, 15, 13, 35, 75, 40,
tasik
0 / 0 / 0
Регистрация: 27.12.2012
Сообщений: 52
15.10.2013, 10:51  [ТС]     Нужно отсортировать одномерный масив #7
Цитата Сообщение от kamre Посмотреть сообщение
Вроде же все тривиально:
C++
1
2
3
4
5
6
7
8
9
10
11
12
#include <algorithm>
#include <iostream>
 
using namespace std;
 
int main() {
  int a[] = { 50, 95, 15, 13, 35, 75, 80, 90, 100, 40 };
  int max = *max_element(begin(a), end(a));
  stable_partition(begin(a), end(a), [=](int i) { return abs(i - max) <= 0.2*abs(max); });
  for (int i : a)
    cout << i << ", ";
}
использую dev cpp portable , ошибка 9 33 ] 'begin' was not declared in this scope , библиотека стл подключена
kamre
126 / 130 / 4
Регистрация: 25.12.2011
Сообщений: 443
15.10.2013, 10:57     Нужно отсортировать одномерный масив #8
Цитата Сообщение от tasik Посмотреть сообщение
использую dev cpp portable
Важно какой компилятор используется. У меня с mingw gcc 4.8.1 (с ключом '-std=c++11') и msvc 2013 все работает.
aLarman
641 / 562 / 89
Регистрация: 13.12.2012
Сообщений: 2,109
15.10.2013, 11:03     Нужно отсортировать одномерный масив #9
Цитата Сообщение от tasik Посмотреть сообщение
C++
1
begin(a)
просто
C++
1
a
C++
1
end(a)
C++
1
а+10
MrGluck
Ворчун
Эксперт CЭксперт С++
6625 / 3816 / 500
Регистрация: 29.11.2010
Сообщений: 10,072
15.10.2013, 12:11     Нужно отсортировать одномерный масив #10
aLarman, не только.
Там из С++11 еще лямбда-функция и for цикл по коллекции. Вот под 98 стандарт:
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
#include <algorithm>
#include <iostream>
#include <cmath>
 
class NearMax
{
  public:
    NearMax(const int x): max(x) {}
    bool operator()(const int x)
    {
        return abs(x - max) <= 0.2*abs(max);
    }
  private:
    int max;
};
 
int main()
{
    int a[] = { 50, 95, 15, 13, 35, 75, 80, 90, 100, 40 };
    const int N = sizeof(a) / sizeof(*a);
    int max = *std::max_element(a, a + N);
    std::stable_partition(a, a + N, NearMax(max));
    for (int i=0; i < N; i++)
        std::cout << a[i] << ", ";
}
Thinker
Эксперт C++
4220 / 2194 / 150
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
15.10.2013, 12:14     Нужно отсортировать одномерный масив #11
Цитата Сообщение от tasik Посмотреть сообщение
Преобразовать массив таким образом...
Задача на прохождение по массиву ровно 1 раз, никаких сортировок и т.д.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.10.2013, 12:47     Нужно отсортировать одномерный масив
Еще ссылки по теме:

C++ Создать одномерный масив целых чисел, используя генератор
C++ Одномерный масив.Добавление элементов в конец.С++
C++ Одномерный масив: расположить символы в обратном порядке
C++ C++, одномерный масив
Создать структуру, используя потоки заполнить масив структурами и отсортировать C++

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

Или воспользуйтесь поиском по форуму:
tasik
0 / 0 / 0
Регистрация: 27.12.2012
Сообщений: 52
15.10.2013, 12:47  [ТС]     Нужно отсортировать одномерный масив #12
Цитата Сообщение от MrGluck Посмотреть сообщение
aLarman, не только.
Там из С++11 еще лямбда-функция и for цикл по коллекции. Вот под 98 стандарт:
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
#include <algorithm>
#include <iostream>
#include <cmath>
 
class NearMax
{
  public:
    NearMax(const int x): max(x) {}
    bool operator()(const int x)
    {
        return abs(x - max) <= 0.2*abs(max);
    }
  private:
    int max;
};
 
int main()
{
    int a[] = { 50, 95, 15, 13, 35, 75, 80, 90, 100, 40 };
    const int N = sizeof(a) / sizeof(*a);
    int max = *std::max_element(a, a + N);
    std::stable_partition(a, a + N, NearMax(max));
    for (int i=0; i < N; i++)
        std::cout << a[i] << ", ";
}
Работает!

Добавлено через 1 минуту
Спасибо всем кто принимал участие.
Тема закрыта.
Yandex
Объявления
15.10.2013, 12:47     Нужно отсортировать одномерный масив
Ответ Создать тему
Опции темы

Текущее время: 01:10. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru