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

Сдвиг нулей в конец массива - C++

Восстановить пароль Регистрация
 
welthel
0 / 0 / 0
Регистрация: 25.11.2013
Сообщений: 7
25.11.2013, 16:11     Сдвиг нулей в конец массива #1
Извините, если данная тема уже поднималась(к сожалению, я таковой на C++ не нашёл).
Суть задачи: нужно отсортировать элементы массива таким образом, чтобы нули сдвинулись в конец, а все остальные элементы сохранили свой порядок. Проблема в том, что программа заканчивается после первого "сдвинутого" нуля.

Вот, что у меня получилось:
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
int n;
cout<<"Введите количество чисел:";
cin>>n;
int *Array= new int[n];
for(int i=0; i<n; i++)
{
    cout << "Введите число[" << i + 1 << "]" << ": ";
            cin >> Array[i];
}
int i=0;
{for(; i<(n-1); i++)
{
    if(Array[i]==0 && !(Array[i+1]==0) )
    {
        swap(Array[i], Array[i+1]);
        
        
    }
}
 
    for(int i=0; i<n; i++)
    {
        cout<<Array[i];
    }
system("PAUSE");
 delete [] Array;
return 0;
}
}
Буду очень благодарен за помощь.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.11.2013, 16:11     Сдвиг нулей в конец массива
Посмотрите здесь:

сдвиг массива C++
Найти количество нулей среди элементов массива, расположенных между минимальным и максимальным элементом массива. C++
C++ добавить в конец массива элементы, расположенные между минимальными и максимальными элементами исходного массива, исключая нулевые
Циклический сдвиг массива без использования вспомогательного массива C++
C++ удаление нулей из массива
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ShadowFirst
54 / 47 / 1
Регистрация: 31.10.2013
Сообщений: 161
25.11.2013, 16:29     Сдвиг нулей в конец массива #2
С таким условием выбора как:
C++
1
2
3
4
if(Array[i]==0 && !(Array[i+1]==0) )
{
    swap(Array[i], Array[i+1]);
}
не получится в принципе сделать нужные действия если будет 2 нуля подряд то 1 нуль останется на своем месте, если 3 нуля подряд то 2 останется на своих местах и так далее
welthel
0 / 0 / 0
Регистрация: 25.11.2013
Сообщений: 7
25.11.2013, 16:36  [ТС]     Сдвиг нулей в конец массива #3
Спасибо большое. Логично, не подумал. А что тогда делать?

Добавлено через 1 минуту
Привязываться как-то только к самому элементу Array[i]?

Добавлено через 1 минуту
Но один ноль, даже с такой проверкой, сбрасывается в конец. 10025 переходит в 10250(0 с 2 меняется, а затем с 5).

Добавлено через 1 минуту
Думал, может, можно сделать какой-нибудь внешний цикл, осуществляющий проверку? Но, как-то в голову не приходит. В любом случае, буду благодарен за любое решение.
IntelCoreDuo
11 / 11 / 0
Регистрация: 09.11.2013
Сообщений: 52
25.11.2013, 16:37     Сдвиг нулей в конец массива #4
Цитата Сообщение от welthel Посмотреть сообщение
Спасибо большое. Логично, не подумал. А что тогда делать?

Добавлено через 1 минуту
Привязываться как-то только к самому элементу Array[i]?

Добавлено через 1 минуту
Но один ноль, даже с такой проверкой, сбрасывается в конец. 10025 переходит в 10250(0 с 2 меняется, а затем с 5).
У тебя предыдущее число же не проверяется. Сначала меняются нули местами, на втором шаге, на третьем он видит 0 и меняет его местами, на четвертом так же, а нуль на втором шаге - остается


Как-то так
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 "stdafx.h"
#include <conio.h> 
#include <iostream>
#include <iomanip>
#include <math.h>
#include <stdlib.h>
#include <time.h>
using namespace std;
int main(){
int n;
 
setlocale(LC_ALL, "Russian");
 
 
cout << "Введите количество чисел:";
cin >> n;
int *Array= new int[n];
for(int i=0; i<n; i++)
{
cout << "Введите число[" << i + 1 << "]" << ": ";
cin >> Array[i];
}
int i=0;
for(i; i<(n-1); i++) {
if(Array[i]==0)
swap(Array[i], Array[i+1]);
if (Array[i-1] == 0)
swap (Array[i-1], Array[i]);
}
 
for(int i=0; i<n; i++) {
cout<<Array[i];
}
system("PAUSE");
delete [] Array;
return 0;
 
}
welthel
0 / 0 / 0
Регистрация: 25.11.2013
Сообщений: 7
25.11.2013, 16:43  [ТС]     Сдвиг нулей в конец массива #5
Честно говоря, не совсем Вас понял. Код работает. Проблема возникает, если нулей несколько.

Добавлено через 2 минуты
Вы все верно объяснили, но я это и сам понимаю. Меня интересует полностью рабочие варианты: иной вариант проверки, дополнительные цикл, etc.

Добавлено через 2 минуты
Спасибо, сейчас проверю.
IntelCoreDuo
11 / 11 / 0
Регистрация: 09.11.2013
Сообщений: 52
25.11.2013, 16:43     Сдвиг нулей в конец массива #6
Цитата Сообщение от welthel Посмотреть сообщение
Честно говоря, не совсем Вас понял. Код работает. Проблема возникает, если нулей несколько.

Добавлено через 2 минуты
Вы все верно объяснили, но я это и сам понимаю. Меня интересует полностью рабочие варианты: иной вариант проверки, дополнительные цикл, etc.
Ну с четырьмя числами работает, если больше, нужно еще подумать
welthel
0 / 0 / 0
Регистрация: 25.11.2013
Сообщений: 7
25.11.2013, 17:01  [ТС]     Сдвиг нулей в конец массива #7
Спасибо, IntelCoreDuo. Всё работает.

Добавлено через 13 минут
К сожалению, проблема полностью не решилась. Если нулей больше 2 подряд, то программа не работает должным образом.

Добавлено через 22 секунды
Может, у кого-нибудь есть светлые мысли?
MicM
 Аватар для MicM
820 / 487 / 90
Регистрация: 29.12.2009
Сообщений: 1,097
Завершенные тесты: 1
25.11.2013, 17:03     Сдвиг нулей в конец массива #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
#include <iostream>
 
int main()
{
    int a[15]={0,0,0,5,0,1,2,0,3,4,0,0,3,2,0};
    int k = 0;
    int i = 0;
    while (i<15-k)
    {
        if (a[i]==0)
        {
            ++k;
            for (int j=i; j<14; j++)
                a[j]=a[j+1];
        }
        else ++i;
    }
    for (i=14; i>14-k; i--)
        a[i]=0;
    for (i=0; i<15; i++)
        std::cout <<a[i] <<" ";
    return 0;
}
welthel
0 / 0 / 0
Регистрация: 25.11.2013
Сообщений: 7
25.11.2013, 17:07  [ТС]     Сдвиг нулей в конец массива #9
MicM, нужен динамический массив.
IntelCoreDuo
11 / 11 / 0
Регистрация: 09.11.2013
Сообщений: 52
25.11.2013, 17:13     Сдвиг нулей в конец массива #10
Цитата Сообщение от welthel Посмотреть сообщение
MicM, нужен динамический массив.
Нужно менять 0 с последней переменной в массиве. Если последняя уже равна нулю, то менять 0 с (последней - 1). Перебором, вижу, сложновато. Хотя и здесь не без сложностей.
welthel
0 / 0 / 0
Регистрация: 25.11.2013
Сообщений: 7
25.11.2013, 17:16  [ТС]     Сдвиг нулей в конец массива #11
Выходит, что иного выхода, помимо создания нового массива - нет? При учёте того, что нужен динамический массив.
MicM
 Аватар для MicM
820 / 487 / 90
Регистрация: 29.12.2009
Сообщений: 1,097
Завершенные тесты: 1
25.11.2013, 17:18     Сдвиг нулей в конец массива #12
ТС написал:
Цитата Сообщение от welthel Посмотреть сообщение
а все остальные элементы сохранили свой порядок.
Если нулевые элементы менять с последним элементом, то порядок следования нарушится
welthel
0 / 0 / 0
Регистрация: 25.11.2013
Сообщений: 7
25.11.2013, 17:48  [ТС]     Сдвиг нулей в конец массива #13
MicM, можно ли обойтись без нового массива? Или для динамического иных вариантов нет?

Добавлено через 23 минуты
Решения, без создания нового массива, нет?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.11.2013, 21:05     Сдвиг нулей в конец массива
Еще ссылки по теме:

C++ Циклический сдвиг массива
C++ Удаление элемента из массива и сдвиг массива
Массив строк. Конец строки и конец массива C++

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

Или воспользуйтесь поиском по форуму:
ShadowFirst
54 / 47 / 1
Регистрация: 31.10.2013
Сообщений: 161
25.11.2013, 21:05     Сдвиг нулей в конец массива #14
решение есть сделать все в одном массиве, я просто не успел написать с работы уходить пора уже было. Вот как я это вижу:
C++
1
2
3
4
5
6
7
8
9
10
11
int *Array= new int[n];
int next = 0;
while (Array[next] != 0) {
    next++;
} 
for(int i=next+1;i < n; i++) {
    if (Array[i] != 0) {
        swap (Array[next],Array[i]);
        next++;    
    }
}
Наверное как то так, сам не проверял но в голове у меня работало)))) Но мог конечно и ошибиться писал так сказать на коленках.
Yandex
Объявления
25.11.2013, 21:05     Сдвиг нулей в конец массива
Ответ Создать тему
Опции темы

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