Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.57/7: Рейтинг темы: голосов - 7, средняя оценка - 4.57
3 / 3 / 4
Регистрация: 03.11.2015
Сообщений: 89

Все повторяющиеся элементы переставить в самое начало

05.01.2017, 07:49. Показов 1477. Ответов 25
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Все повторяющиеся элементы переставить в самое начало.Вот мой код.Не могу понять почему не правильно работает,вроде бы все должно работать.
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
int main()
{
    setlocale(LC_ALL,"Russian");
    const int k = 5;
    int A[k];
    int r = 0;
 
    for(int i = 1;i <= k;i++)
    {
        A[i] = rand() % 5;
        cout<<"\t\A["<<i<<"]="<<A[i]<<endl;
    }
for(int i = 1;i <= k;i++)
        for(int j = 1;j <= k;j++)
        {
           if( i != j )//чтобы не было A[2] == A[2]
           {
            if( A[i] == A[j] )//условие
            {
                  r++;//чтобы переставлять попорядку
            int temp = A[r];//сама перестановка
                A[r] = A[i];
                A[i] = temp;
            }
           }
        }
 
     for(int i = 1;i <= k;i++)
    {
        cout<<"C["<<i<<"]="<<A[i]<<endl;//вывод
    }
 
    _getch();
    return 0;
}
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
05.01.2017, 07:49
Ответы с готовыми решениями:

Переставить все отрицательные элементы в начало массива
Здравствуйте, помогите пожалуйста решить такую задачку! Пусть A - одномерный массив N вещественных чисел (для нечетных вариантов) и N...

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

Одномерный массив. Переставить все повторяющиеся элементы в начало
помогите плиз переставить в одномерном массиве все повторяющиеся элементы в начало.

25
90 / 88 / 33
Регистрация: 20.07.2016
Сообщений: 403
05.01.2017, 10:08
Valuamba, вы пытаетесь произвести запись за пределы массива... в C++ у первого элемента массива нулевой индекс.
1
3 / 3 / 4
Регистрация: 03.11.2015
Сообщений: 89
05.01.2017, 10:49  [ТС]
я поменял,чтобы программа начинала поиск с 0 индекса,но все равно выводит с не правильной перестановкой.
Спасибо,все получилось,просто кто-то слепой
0
90 / 88 / 33
Регистрация: 20.07.2016
Сообщений: 403
05.01.2017, 10:58
Valuamba, перепроверьте при k равном скажем 10... у вас еще остались ошибки в логике программы
0
3 / 3 / 4
Регистрация: 03.11.2015
Сообщений: 89
05.01.2017, 11:15  [ТС]
Да,я заметил,если элемент с 0 индексом равен какому-то элементу с другим индексом,то программа начинает не правильно работать и выводить какие-то большие рандомные числа.
Как раз думаю об этом.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
for(int i = 1;i <= k;i++)
        for(int j = 1;j <= k;j++)
        {
          if( i == 0)
            {
             r++;
                //что-то еще,чтобы программа не переходила к другому условию
           if( i != j )//чтобы не было A[2] == A[2]
           {
            if( A[i] == A[j] )//условие
            {
                  r++;//чтобы переставлять попорядку
            int temp = A[r];//сама перестановка
                A[r] = A[i];
                A[i] = temp;
            }
           }
        }
0
90 / 88 / 33
Регистрация: 20.07.2016
Сообщений: 403
05.01.2017, 11:19
Valuamba, ... еще раз, индексы массива в С++ начинаются с 0! следовательно индекс последнего элемента будет равен k-1!!!!!
с этим надеюсь разобрались... это пол дела, вторая половина - у вас в логике программы ошибка, переделайте алгоритм
0
3 / 3 / 4
Регистрация: 03.11.2015
Сообщений: 89
05.01.2017, 11:23  [ТС]
Извиняюсь это старый код,я его здесь еще не редактировал.
Вот новый:
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
int main()
{
    setlocale(LC_ALL,"Russian");
    const int k = 15;
    int A[k];
    int r = 0;
 
    for(int i = 0;i < k;i++)
    {
        A[i] = rand() % 5;
        cout<<"\t\A["<<i<<"]="<<A[i]<<endl;
    }
 
        
    for(int i = 0;i < k;i++)
        for(int j = 0;j < k;j++)
        {
           if( i != j )//чтобы не было A[2] == A[2]
           {
            if( A[i] == A[j] )//условие
            {
            int temp = A[r];//сама перестановка
                A[r] = A[i];
                A[i] = temp;
                   r++;//чтобы переставлять попорядку
            }
           }
        }
 
     for(int i = 0;i < k;i++)
    {
        cout<<"C["<<i<<"]="<<A[i]<<endl;//вывод
    }
 
    _getch();
    return 0;
}
0
Эксперт С++
1624 / 954 / 782
Регистрация: 06.02.2016
Сообщений: 2,452
Записей в блоге: 31
05.01.2017, 12:11
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <iostream>
#include <vector>
#include <algorithm>
#include <iterator>
using namespace std;
int main() {
    vector<int>v {10,20,20,20,30,30,20,20,10},v1;
    sort(v.begin(),v.end());
    vector<int>::iterator it=unique(v.begin(),v.end());
    copy(it,v.end(),back_inserter(v1));
    copy(v.begin(),it,back_inserter(v1));
    copy(v1.begin(),v1.end(),ostream_iterator<int>(cout," "));
    return 0;
}
0
90 / 88 / 33
Регистрация: 20.07.2016
Сообщений: 403
05.01.2017, 12:25
Peoples, это не будет работать... алгоритм std::unique не заботится о сохранности повторяющихся элементов...

Добавлено через 3 минуты
Valuamba
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
#include <iostream>
#include <algorithm>
 
 
int main()
{
  const int k = 10;
  int A[k],
      result[k];
  srand(time(0));
 
  for(int i = 0; i != k; ++i)
  {
    A[i] = rand() % 8;
    std::cout<<"A["<<i<<"]="<<A[i]<<std::endl;
  }
  std::cout << std::endl;
 
  std::sort(std::begin(A), std::end(A));
  size_t cnt = 0,
         begCnt = 0,
         endCnt = k - 1;
 
  for (size_t j = 0 ; j < k - 1; ++j)
  {
    for (size_t i = j + 1; i != k; ++i)
      if (A[j] == A[i])
        ++cnt;
 
    if (cnt)
    {
      ++cnt;
      for (size_t l = 0; l != cnt; ++l)
        result[begCnt++] = A[j];
 
      j += --cnt;
      cnt = 0;
    }
    else
      result[endCnt--] = A[j];
  }
 
 
  for(int i = 0; i != k; ++i)
     std::cout<<"C["<<i<<"]="<<result[i]<<std::endl;
 
  system("pause");
  return 0;
Peoples
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
#include <iostream>
#include <vector>
#include <list>
#include <algorithm>
#include <random>
#include <iterator>
#include <functional>
 
//=============================================================================
int main ()
{
  std::random_device rd;
  std::default_random_engine dre(rd());
  std::uniform_int_distribution<size_t> distr(0, 5);
 
  std::vector<size_t> frst(10, 0);
  std::list<size_t> result;
 
  std::generate(frst.begin(), frst.end(), std::bind(distr, dre));
  std::copy(frst.cbegin(), frst.cend(), std::ostream_iterator<size_t>(std::cout, " "));
  std::cout << std::endl;
 
  std::sort(frst.begin(), frst.end());
 
  auto it = frst.cbegin();
  while (it != frst.cend())
  {
    auto itTop = std::upper_bound(it, frst.cend(), *it);
    if (itTop - it > 1)
      std::copy(it, itTop, std::front_inserter(result));
    else
      result.push_back(*it);
 
    it = itTop;
  }
 
  std::copy(result.cbegin(), result.cend(), std::ostream_iterator<size_t>(std::cout, " "));
  std::cout << std::endl;
 
  return 0;
}
Я б с удовольствием посмотрел на реализацию без дополнительного контейнера, это реально сложно) жаль сейчас времени нет)
0
Эксперт С++
1624 / 954 / 782
Регистрация: 06.02.2016
Сообщений: 2,452
Записей в блоге: 31
05.01.2017, 12:29
JIawliet, Так вроде же работает, или я что-то путаю?
Миниатюры
Все повторяющиеся элементы переставить в самое начало  
0
90 / 88 / 33
Регистрация: 20.07.2016
Сообщений: 403
05.01.2017, 12:34
Peoples либо скрин обрезан, либо одну 10 вы потеряли...

Прочитайте про то как работает алгоритм std::unique


На выходе имеем лишнюю 30 и соответственно одна 10 потерялась.
Миниатюры
Все повторяющиеся элементы переставить в самое начало  
0
05.01.2017, 12:37

Не по теме:


Извиняюсь, скрин не обрезан. Действительно недоглядел

0
90 / 88 / 33
Регистрация: 20.07.2016
Сообщений: 403
05.01.2017, 12:41
Peoples, в любом случаи у вас на скрине выведено только 8 элементов, а в контейнере - 9... но это не главная беда... главная проблем - std::unique превращает повторяющиеся элементы в кашу
2
Эксперт С++
1624 / 954 / 782
Регистрация: 06.02.2016
Сообщений: 2,452
Записей в блоге: 31
05.01.2017, 12:44
JIawliet,Понял свою ошибку, спасибо
0
90 / 88 / 33
Регистрация: 20.07.2016
Сообщений: 403
05.01.2017, 14:21
Наверное не самый изящный и эффективный способ, но зато без использования дополнительного контейнера:
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 <vector>
#include <algorithm>
#include <random>
#include <iterator>
#include <functional>
 
//=============================================================================
using Iter = std::vector<size_t>::const_iterator;
 
void showData (Iter frst, Iter lst)
{
  std::copy(frst, lst, std::ostream_iterator<size_t>(std::cout, " "));
  std::cout << std::endl;
}
 
//=============================================================================
int main ()
{
  std::random_device rd;
  std::default_random_engine dre(rd());
  std::uniform_int_distribution<size_t> distr(0, 20);
 
  const size_t SZ = 10;
  std::vector<size_t> vec(SZ, 0);
 
  std::generate(vec.begin(), vec.end(), std::bind(distr, dre));
  showData(vec.cbegin(), vec.cend());
 
  std::sort(vec.begin(), vec.end());
 
  auto it = vec.begin(),
       itEnd = vec.end();
  while (it < itEnd)
  {
    auto itTop = std::upper_bound(it, itEnd, *it);
    if (itTop - it == 1)
      std::rotate(it, itTop, itEnd--);
    else
      it = itTop;
  }
 
  showData(vec.cbegin(), vec.cend());
 
  return 0;
}
0
3 / 3 / 4
Регистрация: 03.11.2015
Сообщений: 89
05.01.2017, 20:46  [ТС]
Спасибо,но я еще не дошел дошел до темы с
Цитата Сообщение от JIawliet Посмотреть сообщение
std::sort(std::begin(A), std::end(A));
и
Цитата Сообщение от JIawliet Посмотреть сообщение
size_t cnt = 0,
0
90 / 88 / 33
Регистрация: 20.07.2016
Сообщений: 403
05.01.2017, 21:01
Valuamba ничего страшного, std::sort - сортировка массива... вам придется написать свою... так как скорость не важна - советую сортировку пузырьком, она самая легкая... код можете найти в этой теме: Алгоритмы сортировок

а на счет size_t - это почти тоже самое, что и unsigned int... если вы замените size_t на unsigned, то абсолютно ничего в вашей программе не испортится) удачи)
0
Модератор
Эксперт CЭксперт С++
 Аватар для sourcerer
5288 / 2376 / 342
Регистрация: 20.02.2013
Сообщений: 5,773
Записей в блоге: 20
05.01.2017, 21:19
Valuamba, дойдите.

Можете вместо size_t написать unsigned int.

А вместо
C++
1
std::sort(std::begin(A), std::end(A));
в Вашем случае можно написать так:
C++
1
std::sort(A, A+k);
Глобальная функция std::sort (см. тут и тут) представляет из себя стандартный библиотечный алгоритм для сортировки заданной последовательности (в Вашем случае - все элементы Вашего массива).

В качестве аргументов функции std::sort передаются два итератора (это такие специальные указатели с дополнительными свойствами). Первый итератор указывает на первый элемент последовательности, а второй итератор - на элемент, следующий за последним элементом последовательности. Таким образом, если в Вашем массиве 10 элементов (k = 10), то итератором, указывающим на первый элемент будет либо &A[0] либо просто A, а итератором, указывающим на элемент, следующий за последним элементом последовательности, будет либо &A[10] либо просто A+k.

Добавлено через 17 минут
Valuamba, вот Вам четыре маленьких примера с сортировкой массива при помощи std::sort:
Пример #1

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream>
#include <algorithm>
 
int main()
{
    const unsigned int k = 10;
    int A[k] = { 2, 9, 0, 3, 8, 7, 6, 9, 0, 2 };
 
    for ( unsigned int i = 0; i < k; ++i )
        std::cout << A[i] << " ";
 
    std::cout << "\n\n";
 
    std::sort( &A[0], &A[10] );
 
    for ( unsigned int i = 0; i < k; ++i )
        std::cout << A[i] << " ";
}

Пример #2

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream>
#include <algorithm>
 
int main()
{
    const unsigned int k = 10;
    int A[k] = { 2, 9, 0, 3, 8, 7, 6, 9, 0, 2 };
 
    for ( unsigned int i = 0; i < k; ++i )
        std::cout << A[i] << " ";
 
    std::cout << "\n\n";
 
    std::sort( A, A + k );
 
    for ( unsigned int i = 0; i < k; ++i )
        std::cout << A[i] << " ";
}

Пример #3

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <iostream>
#include <algorithm>
#include <iterator>
 
int main()
{
    const unsigned int k = 10;
    int A[k] = { 2, 9, 0, 3, 8, 7, 6, 9, 0, 2 };
 
    for ( unsigned int i = 0; i < k; ++i )
        std::cout << A[i] << " ";
 
    std::cout << "\n\n";
 
    std::sort( std::begin( A ), std::end( A ) );
 
    for ( unsigned int i = 0; i < k; ++i )
        std::cout << A[i] << " ";
}

Пример #4

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream>
#include <algorithm>
#include <vector>
 
int main()
{
    std::vector<int> A = { 2, 9, 0, 3, 8, 7, 6, 9, 0, 2 };
 
    for ( unsigned int i = 0; i < A.size(); ++i )
        std::cout << A[i] << " ";
 
    std::cout << "\n\n";
 
    std::sort( A.begin(), A.end() );
 
    for ( unsigned int i = 0; i < A.size(); ++i )
        std::cout << A[i] << " ";
}


Добавлено через 53 секунды
JIawliet, опередили меня )))
1
3 / 3 / 4
Регистрация: 03.11.2015
Сообщений: 89
06.01.2017, 00:52  [ТС]
Спасибо,постараюсь разобраться.Как я понимаю в моем коде проблема состоит в том,что если элемент массива A[i] == A[j] и его индекс i=0,то он начинает неправильную перестановку?
0
90 / 88 / 33
Регистрация: 20.07.2016
Сообщений: 403
06.01.2017, 09:02
Цитата Сообщение от Valuamba Посмотреть сообщение
Спасибо,постараюсь разобраться.Как я понимаю в моем коде проблема состоит в том,что если элемент массива A[i] == A[j] и его индекс i=0,то он начинает неправильную перестановку?
нет, у вас не правильный алгоритм, он не будет работать... попробуйте вникнуть в примеры приведенные выше
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
06.01.2017, 09:02
Помогаю со студенческими работами здесь

Переставить все максимальные элементы списка в его конец, все минимальные в начало
помогите плз написать программу Переставить все максимальные элементы списка в его конец ,все минимальные в начало

Переставить в начало массива все положительные элементы
Сформировать одномерный массив из 20 случайных чисел (положительных и отрицательных), и переставить в начало все положительные элементы. ...

Переставить в массиве все отрицательные элементы в начало массива, сохраняя относительный порядок
Проштудировал весь форум.Решений много взял по примеру написал код, ошибок нет но ответа нужного нет помогите найти где не разобрался. С...

Найти все минимальные и максимальные элементы и переставить их в начало и конец списка соответственно
Помогите пожалуйста решить задачку. Задан список, нужно найти все минимальные и максимальные элементы и переставить их в начало и конец...

Дана матрица.Заменить все повторяющиеся элементы - 1, а не повторяющиеся - 0
Дана матрица. Заменить все повторяющиеся элементы - 1, а не повторяющиеся - 0. Как мне заменить? Заранее спасибо. namespace...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Автозаполнение реквизита при выборе элемента справочника
Maks 27.03.2026
Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. При выборе "Спецтехники" (Тип Справочник. Спецтехника), заполняется. . .
Сумматор с применением элементов трёх состояний.
Hrethgir 26.03.2026
Тут. https:/ / fips. ru/ EGD/ ab3c85c8-836d-4866-871b-c2f0c5d77fbc Первый документ красиво выглядит, но без схемы. Это конечно не даёт никаких плюсов автору, но тем не менее. . . всё может быть. . .
Автозаполнение реквизитов при создании документа
Maks 26.03.2026
Программный код из решения ниже размещается в модуле объекта документа, в процедуре "ПриСозданииНаСервере". Алгоритм проверки заполнения реализован для исключения перезаписи значения реквизита,. . .
Команды формы и диалоговое окно
Maks 26.03.2026
1. Команда формы "ЗаполнитьЗапчасти". Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. В качестве источника данных. . .
Кому нужен AOT?
DevAlt 26.03.2026
Решил сделать простой ланчер Написал заготовку: dotnet new console --aot -o UrlHandler var items = args. Split(":"); var tag = items; var id = items; var executable = args;. . .
Отправка уведомления на почту при создании или изменении элементов справочника
Maks 24.03.2026
Программная отправка письма электронной почты на примере типового справочника "Склады" в конфигурации БП3. Перед реализацией необходимо выполнить настройку системной учетной записи электронной. . .
модель ЗдравоСохранения 5. Меньше увольнений- больше дохода!
anaschu 24.03.2026
Теперь система здравосохранения уменьшает количество увольнений. 9TO2GP2bpX4 a42b81fb172ffc12ca589c7898261ccb/ https:/ / rutube. ru/ video/ a42b81fb172ffc12ca589c7898261ccb/ Слева синяя линия -. . .
Midnight Chicago Blues
kumehtar 24.03.2026
Такой Midnight Chicago Blues, знаешь?. . Когда вечерние улицы становятся ночными, а ты не можешь уснуть. Ты идёшь в любимый старый бар, и бармен наливает тебе виски. Ты смотришь на пролетающие. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru