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

Все отрицательные в конец массива - C++

Восстановить пароль Регистрация
 
hally
 Аватар для hally
0 / 0 / 0
Регистрация: 21.12.2011
Сообщений: 16
11.01.2012, 18:55     Все отрицательные в конец массива #1
В одномерном массиве все отрицательные элементы переместить в конец.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.01.2012, 18:55     Все отрицательные в конец массива
Посмотрите здесь:

[C++]Все отрицательные элементы массива перенести в начало, а все остальные - в конец C++
все положительные элементы поставить в начало а отрицательные в конец C++
C++ Дан одномерный массив А, состоящий из N элементов. Перенести в начало массива все четные элементы, а в конец массива - все нечетные
Дан одномерный массив А, состоящий из N элементов. Перенести в начало массива все четные элементы, а в конец массива - все нечетные C++
В одномерном массиве все отрицательные элементы переместить в начало массива, а остальные – в конец с сохранением порядка следования C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
go
Эксперт C++
3582 / 1362 / 128
Регистрация: 16.04.2009
Сообщений: 4,528
11.01.2012, 19:09     Все отрицательные в конец массива #2
C
1
2
3
4
5
6
int compare (const void * a, const void * b)
{
  return ( *(int*)b - *(int*)a);
}
 
qsort (values, SIZE, sizeo f(int), compare);
hally
 Аватар для hally
0 / 0 / 0
Регистрация: 21.12.2011
Сообщений: 16
11.01.2012, 19:22  [ТС]     Все отрицательные в конец массива #3
можно целую задачу,нормально написанную
go
Эксперт C++
3582 / 1362 / 128
Регистрация: 16.04.2009
Сообщений: 4,528
11.01.2012, 19:33     Все отрицательные в конец массива #4
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <stdio.h>
#include <stdlib.h>
 
int compare (const void * a, const void * b)
{
  return ( *(int*)b - *(int*)a);
}
 
int main (void)
{
   int arr[] = { -40, 10, -100, 90, 20, 25 };
   const int SIZE = sizeof (arr) / sizeof (arr[0]);
   int n;
   
   qsort (arr, SIZE, sizeof(int), compare);
 
   for (n=0; n<6; n++)
      printf ("%5d ", arr[n]);
   return 0;
}
http://liveworkspace.org/code/c3347e...c23c618b0d1079
R136a1
 Аватар для R136a1
142 / 111 / 15
Регистрация: 14.04.2011
Сообщений: 261
11.01.2012, 19:39     Все отрицательные в конец массива #5
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 <iomanip>
#include <cstdlib>
#include <ctime>
#include <algorithm>
 
void repl(int [], int, int);
 
int main()
{
    int mass[10];
 
    srand(time(NULL));
 
    for(int i = 0; i < 10; i++)
    {
        mass[i] = 1 + rand() % 15;
 
        if(i % 2 == 0)
            mass[i] *= -1;
 
        std::cout << std::setw(5) << mass[i];
    }
 
    std::cout << std::endl;
 
    std::sort(mass,mass + 10);
 
    repl(mass,0,9);
 
    for(int i = 0; i < 10; i++)
        std::cout << std::setw(5) << mass[i];
 
    std::cout << std::endl;
 
    return 0;
}
 
void repl(int mass[], int step, int end)
{
    if(mass[step] < 0 && step < end)
    {
        std::swap(mass[step],mass[end]);
        repl(mass,step+1,end-1);
    }
}
hally
 Аватар для hally
0 / 0 / 0
Регистрация: 21.12.2011
Сообщений: 16
11.01.2012, 22:47  [ТС]     Все отрицательные в конец массива #6
Сделайте чтобы вручную массив вводить
go
Эксперт C++
3582 / 1362 / 128
Регистрация: 16.04.2009
Сообщений: 4,528
11.01.2012, 22:52     Все отрицательные в конец массива #7
C++
1
2
3
4
5
template <class T> void input (T *first, T *last)
{
    for ( ; first != last ; ++first )
        std::cin >> *first;
}
hally
 Аватар для hally
0 / 0 / 0
Регистрация: 21.12.2011
Сообщений: 16
11.01.2012, 23:36  [ТС]     Все отрицательные в конец массива #8
а можно в программу в простом виде без сложных функций
Gepar
 Аватар для Gepar
1173 / 529 / 20
Регистрация: 01.07.2009
Сообщений: 3,508
12.01.2012, 00:03     Все отрицательные в конец массива #9
hally, ну так соедините же всё в одно, вам уже и так готовое написали, с вас минимальные познания в программировании требуются чтобы совместить всё.
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
12.01.2012, 10:51     Все отрицательные в конец массива #10
Если важен изначальный порядок следования, то так (на счёт предиката не очень уверен, но все мои тесты вроде прошёл):
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
#include <iostream>
#include <vector>
#include <algorithm>
#include <iterator>
 
template<typename T>
bool lz_order(const T& left, const T& right)
{
    if (left < T())
        return false;
    else if (right < T())
        return true;
    else
        return false;
}
 
int main()
{
    std::vector<int> vec((std::istream_iterator<int>(std::cin)), std::istream_iterator<int>());
    
    std::stable_sort(vec.begin(), vec.end(), lz_order<int>);
    
    std::copy(vec.begin(), vec.end(), std::ostream_iterator<int>(std::cout, "  "));
    
    return 0;
}
Dekio
Фрилансер
Эксперт C++
 Аватар для Dekio
5816 / 1214 / 214
Регистрация: 23.11.2010
Сообщений: 3,378
Записей в блоге: 1
12.01.2012, 12:56     Все отрицательные в конец массива #11
Что бы не дублировать return можно немножко упростить
C++
1
2
3
4
5
template<typename T>
bool lz_order(const T& left, const T& right)
{
        return right < T() ? true : false;
}
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
12.01.2012, 13:00     Все отрицательные в конец массива #12
Dekio, не прокатит. Сначала всё равно надо проверить left.

Добавлено через 1 минуту
Т.е. так:
C++
1
2
3
4
5
template<typename T>
bool lz_order(const T& left, const T& right)
{
    return left < T() ? false : right < T() ? true : false;
}
Петррр
 Аватар для Петррр
5915 / 3352 / 333
Регистрация: 28.10.2010
Сообщений: 5,926
12.01.2012, 13:47     Все отрицательные в конец массива #13
partition не канает?
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
12.01.2012, 13:51     Все отрицательные в конец массива #14
Петррр, порядок не сохранится. Для такого варианта уже были предложены решения.
Shaykemelov
9 / 9 / 2
Регистрация: 14.11.2011
Сообщений: 27
12.01.2012, 16:08     Все отрицательные в конец массива #15
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include<iostream>
using namespace std;
int main()
{
    int n,a[100000],i;
    cin>>n;
    for (i=1; i<=n; i++)
    {
        cin>>a[i];
    }
    for (i=1; i<=n; i++)
    {
        if (a[i]>=0) cout<<a[i]<<" ";
    }
    for (i=1; i<=n; i++)
    {
        if (a[i]<0) cout<<a[i]<<" ";
    }
    system("pause");
    return 0;
}
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
12.01.2012, 16:11     Все отрицательные в конец массива #16
Shaykemelov, ваш код не выполняет поставленную задачу. Необходимо не просто вывести элементы в определённом порядке, а физически перегруппировать их так, чтобы все отрицательные числа оказались после всех неотрицательных.
Genja
 Аватар для Genja
0 / 0 / 0
Регистрация: 12.01.2012
Сообщений: 4
12.01.2012, 17:00     Все отрицательные в конец массива #17
да что-то задано не так
go
Эксперт C++
3582 / 1362 / 128
Регистрация: 16.04.2009
Сообщений: 4,528
23.01.2012, 22:53     Все отрицательные в конец массива #18
Вариант на Си
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
#include <stdio.h>
 
int fun(int val) 
{
    if ( val )
        return 0;
    return 1;
}
 
void My_sort(int* first, int* last, int (*Pred) (int )) 
{
    int t, *right, *tt;
    for ( right = last ; (right > first) && Pred(*(right - 1)) ; --right )
        ;
    for ( ; first < right ; ++first )
        if ( Pred(*first) )
        {
            t = *first; 
            for ( tt = first + 1 ; (tt != right) && Pred(*tt) ; ++tt )
                ;
            *first = *(tt);
            *(tt) = t;
            right -= Pred(*(right - 1)) ? 1 : 0;
        }
}
 
#define SIZE(a) ((sizeof(a)) / (sizeof(*a)))
 
int main(void)
{
    int arr[] = { 1, 2, 0, 0, 3, 4, 0, 5, 6, 0, 0, 1}, i;
 
    My_sort(arr, arr + SIZE(arr), fun);
    for ( i = 0 ; i < SIZE(arr) ; ++i )
        printf ("%5d", arr[i]);
    printf ("\n");
 
    return 0;
}
http://liveworkspace.org/code/886903...2f920777ed9def

Добавлено через 3 часа 56 минут
Этот же код на С++11
C++
1
2
3
4
5
6
7
8
9
10
11
12
#include <iostream>
#include <algorithm>
 
#define SIZE(a) ((sizeof(a)) / (sizeof(*a)))
 
int main(void)
{
   int arr[] = { 1, 2, 0, 0, 3, 4, 0, 5, 6, 0, 0, 1}, i;
   std::stable_sort(arr, arr + SIZE(arr), [] (int i, int j) { return ((i != 0) && (j == 0)); });
   for (auto it = arr ; it < arr + SIZE(arr) ; ++it )
      std::cout << *it << std::endl;
}
http://liveworkspace.org/code/0adb11...0085adad6da5da
Только я сделал, перемещение нулей в конец, но переделать не проблема. Только фугкцию сравнения изменить
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.02.2012, 18:46     Все отрицательные в конец массива
Еще ссылки по теме:

C++ Заполнить рандомно массив и все отрицательные элементы отправить в конец
C++ Для каждого из массивов все отрицательные элементы переместить в начало массива, а все положительные — в конец
Отрицательные элементы массива переместить в конец C++

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

Или воспользуйтесь поиском по форуму:
go
Эксперт C++
3582 / 1362 / 128
Регистрация: 16.04.2009
Сообщений: 4,528
18.02.2012, 18:46     Все отрицательные в конец массива #19
Цитата Сообщение от silent_1991 Посмотреть сообщение
Петррр, порядок не сохранится. Для такого варианта уже были предложены решения.
Тогда stable_partition
Yandex
Объявления
18.02.2012, 18:46     Все отрицательные в конец массива
Ответ Создать тему
Опции темы

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