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

Отсортировать по возрастанию только положительные элементы массива

10.11.2015, 14:47. Просмотров 1708. Ответов 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
#include <iostream>
#include <stdlib.h>
#include <time.h>
#include <locale.h>
using namespace std;
int main()
{
        const int max_elem=10;
        int mas[max_elem];
        
        for(int i=0;i<max_elem;i++)
        {
                mas[i]=rand()%100-50;
        }
        cout<<"Array : ";
        for (int i=0;i<max_elem;i++)
            cout<<mas[i]<<" ";
         cout<<"\n";   
        int n;
        for(int cur=0;cur<max_elem;cur++)
                for(int i=0;i<max_elem-1;i++)
                        if(mas[i]>mas[i+1] && mas[i]>0)
                        {
                            int t=mas[i];
                                mas[i]=mas[i+1];
                                mas[i+1]=t;
                        }
 
 cout<<"New Array : ";
        for(int i=0;i<max_elem;i++)
              cout<<mas[i]<<" ";
 
        system ("pause");
}
0
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.11.2015, 14:47
Ответы с готовыми решениями:

Отсортировать по возрастанию только четные элементы массива
№1: Отсортировать по возрастанию только четные элементы массива.

Отсортировать по возрастанию только четные элементы массива
№1: Отсортировать по возрастанию только четные элементы массива. У меня массив сам выводится, но...

Используя функции сформировать одномерный массив и отсортировать по возрастанию только те элементы массива, которые являются простыми числами
Помогите закончить две задачи. 1. Используя функции сформировать одномерный массив и отсортировать...

Отсортировать только положительные элементы масива по росту
Как єто сделать?

Упорядочить по возрастанию только: положительные элементы списка
Упорядочить по возрастанию только: положительные элементы списка

9
Dimension
Dimension
574 / 444 / 221
Регистрация: 08.04.2014
Сообщений: 1,709
Завершенные тесты: 1
10.11.2015, 15:04 2
нужно сравнивать не со следующем ,а пока не найдется положительный
0
AwdeUfa
0 / 0 / 0
Регистрация: 19.11.2014
Сообщений: 32
10.11.2015, 16:18  [ТС] 3
То есть проверку нужно сделать только на 0? А как условие подправить?
0
pproger
165 / 68 / 17
Регистрация: 22.03.2011
Сообщений: 196
10.11.2015, 16:24 4
Лучший ответ Сообщение было отмечено AwdeUfa как решение

Решение

AwdeUfa, ня
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
#include <iostream>
#include <vector>
#include <algorithm>
 
using namespace std;
 
int main()
{
    vector<int> a(10), b;
 
    srand(time(0));
 
    for (auto &i : a) {
        i = (rand() % 100) - 50;
        cout << i << endl;
        if (i >= 0) {
            b.push_back(i);
        }
    }
 
    sort(b.begin(), b.end());
    cout << endl << endl;
 
    auto it = b.begin();
    for (auto &i : a) {
        if (i >= 0) {
            i = *it++;
        }
        cout << i << endl;
    }
}
1
10.11.2015, 16:24
AwdeUfa
0 / 0 / 0
Регистрация: 19.11.2014
Сообщений: 32
10.11.2015, 16:50  [ТС] 5
Спасибо
0
Геомеханик
807 / 610 / 940
Регистрация: 26.06.2015
Сообщений: 1,409
10.11.2015, 16:52 6
Лучший ответ Сообщение было отмечено AwdeUfa как решение

Решение

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
#include <iostream>
 
template<typename T, typename Cmp1, typename Cmp2>
void bsort_if(T a[], unsigned n, Cmp1 cmp1, Cmp2 cmp2){
    bool next;
    unsigned i, j;
    do {
        next = false;
        for(i = j = 0; i < n; i = j){
            while((i < n) && !cmp1(a[i]))
                ++i;
 
            j = i + 1;
            while((j < n) && !cmp1(a[j]))
                ++j;
 
            if((j < n) && cmp2(a[j], a[i])){
                std::swap(a[j], a[i]);
                next = true;
            }
        }
    } while(next);
}
 
int main(void){
    int    a[] = { -1, 3, -7, 6, 5, -1, 7, 4, 1, -4, 8, 9, -5, 2 };
    unsigned n = sizeof(a)/sizeof(a[0]);
 
    bsort_if(a, n, 
            [] (int n) { return (n > 0); }, 
            [] (int a, int b) { return (a < b); }
    );
 
    for(unsigned i = 0; i < n; ++i)
        std::cout << a[i] << ' ';
    return 0;
}
Пример работы кода
1
Dimension
Dimension
574 / 444 / 221
Регистрация: 08.04.2014
Сообщений: 1,709
Завершенные тесты: 1
10.11.2015, 17:04 7
C++
1
2
3
4
5
6
7
8
9
for(int cur=0;cur<max_elem;cur++)
            for(int i=0;i<max_elem-1;i++){
                    int t=i;
                    if(mas[t]>0)
                        while(mas[i+1]<0 && i <max_elem)
                            i++;
                    if(mas[t]>mas[i+1])
                        swap(mas[t],mas[i+1]);  
                }
1
pproger
165 / 68 / 17
Регистрация: 22.03.2011
Сообщений: 196
12.11.2015, 02:01 8
я вот думаю, а как решить эту задачу, используя стандартные алгоритмы сортировки, и не используя доп памяти, как это сделал я.
вижу 2 варианта:
1. реализовать свой random_access_iterator с доп параметром-функтором, который будет пропускать элементы, не удовлетворяющие результату функтора.
2. завести доп память под указатели/итераторы интересных нам элементов, поместив их в отдельный контейнер в класс-обертку, у которого переопределить необходимые операторы, а так же шаблонную функцию swap, т.к должны меняться местами не только указатели, но и сами элементы. ну и натравить sort на этот контейнер.

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

у кого еще какие идеи?
0
Andreas_Kara
32 / 32 / 21
Регистрация: 26.10.2015
Сообщений: 94
12.11.2015, 13:07 9
pproger, решил попробовать сделать итератор. Первый раз писал класс итератор. Так что не судите строго.
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
#include <iostream>
#include <cstdlib>
#include <ctime>
#include <iomanip>
 
using namespace std;
 
class iter
{
    int* ptr;
public:
    iter operator++()
    {
        ++ptr;
        while(*ptr < 0)
            ++ptr;
        return *this;
    }
    iter operator+(int n)
    {
        iter temp = *this;
        while(n)
        {
            ++temp;
            --n;
        }
        return temp;
    }
    iter operator=(int* right)
    {
        ptr = right;
        while(*ptr < 0)
            ++ptr;
        return *this;
    }
    iter operator=(iter right)
    {
        ptr = right.ptr;
        return *this;
    }
    int& operator*()
    {
            return *ptr;
    }
    bool operator<(int* right)
    {
        return ptr < right;
    }
};
 
const size_t sze = 10;
 
int main()
{
    srand(time(0));
    int ms[sze];
    iter it, jt;
    for(int i = 0; i != sze; i++)
        cout << setw(4) << (ms[i] = rand()%20 - 10);
    cout << endl;
    for(it = ms; it < ms + 10; ++it)
        for(jt = it + 1; jt < ms + 10; ++jt)
            if(*it > *jt)
            {
                int temp = *jt;
                *jt = *it;
                *it = temp;
            }
    for(int i = 0; i != sze; i++)
        cout << setw(4) << ms[i];
    return 0;
}
0
pproger
165 / 68 / 17
Регистрация: 22.03.2011
Сообщений: 196
12.11.2015, 14:25 10
Andreas_Kara, я имел ввиду запилить stl совместимый итератор, чтоб стандартные алгоритмы использовать можно было.
0
12.11.2015, 14:25
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.11.2015, 14:25

Отсортировать элементы массива: отрицательные – в начало массива, положительные – в конец
написать две проги...Желательно в Microsoft Visual Studio. Исходный массив инициализировать...

Отсортировать по возрастанию элементы массива
1)Дан массив целых чисел из 10 элементов отсортировать по возрастанию. 2)Дан действительный массив...

Отсортировать элементы массива по возрастанию
Здравствуйте,нужна программа на массиве одномерном. Задание: Задан массив из k чисел....


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

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

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