Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.67
krigan
1 / 1 / 3
Регистрация: 31.10.2012
Сообщений: 93
#1

Сортировка выбором - C++

25.09.2014, 12:57. Просмотров 2468. Ответов 11
Метки нет (Все метки)

Разбираю сортировку выбором. Как реализовать сортировку по возрастанию понял, а как реализовать сортировку по возрастанию до первого отрицательного элемента, а после первого отрицательного сортировать массив по убыванию при этом оставить первый отрицательный элемент на своём месте, не догоняю.

Обращаюсь с просьбой к Гуру программирования помочь с реализацией.

Вот условие задания:

1.Ввести массив случайных чисел. Найти первое отрицательное число в массиве, до него сортировка должна идти
по возрастанию, а после него по убыванию. А найденное число находится на своем месте. Использовать сортировку выбором.

2.Выполнить предыдущую задачу используя "пузырьковую" сортировку.

А это то где я застрял:

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
#include<iostream>
#include <stdlib.h>
#include <time.h>
 
using namespace std;
 
void choicesSort(int* arrayPtr, int length_array) // сортировка выбором
{
    for (int repeat_counter = 0; repeat_counter < length_array; repeat_counter++)
    {
        int temp = arrayPtr[0]; // временная переменная для хранения значения перестановки
        for (int element_counter = repeat_counter + 1; element_counter < length_array; element_counter++)
        {
            if (arrayPtr[repeat_counter] > arrayPtr[element_counter] )
            {
                temp = arrayPtr[repeat_counter];
                arrayPtr[repeat_counter] = arrayPtr[element_counter];
                arrayPtr[element_counter] = temp;
            }
        }
    }
}
 
void main()
 
{
 
    setlocale(LC_CTYPE,"rus");
    srand(time(NULL));
 
    const long SIZE=10;
    int ar[SIZE];
 
    //до сортировки
    for (int i = 0; i < SIZE; i++)
    {
      ar[i]=-30+rand()%100;
      cout<<ar[i]<<"   ";
    }
    
    cout<<"\n\n";
    choicesSort(ar,SIZE);
 
    //после сортировки
    for (int i = 0; i < SIZE; i++)
    {
        cout<<ar[i]<<"   ";
    }
 
    cout<<"\n\n";
 
 
}
1
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.09.2014, 12:57
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Сортировка выбором (C++):

Сортировка выбором на с++
Сортировка выбором. Выбрать минимальный элемент в массиве, перенести в...

сортировка выбором
помогите пожалуйста, алгоритм не работает то есть не сортирует #ifndef FUNC...

Сортировка выбором
#include &lt;iostream&gt; #include &lt;math.h&gt; #include &lt;conio.h&gt; #include &lt;cstdlib&gt;...

сортировка выбором
нужно сделать вместо сортировки пузырьком, сортировку выбором, помогите...

Сортировка выбором
Помогите тут сделать сортировку выбором for (i = 0; i&lt;n; i++) { for (j =...

сортировка выбором
не могу разобраться с задачей, не разбираюсь в указателях(((: сортировка...

11
John Prick
831 / 764 / 256
Регистрация: 27.07.2012
Сообщений: 2,176
Завершенные тесты: 3
25.09.2014, 13:03 #2
Цитата Сообщение от krigan Посмотреть сообщение
как реализовать сортировку по возрастанию до первого отрицательного элемента, а после первого отрицательного сортировать массив по убыванию при этом оставить первый отрицательный элемент на своём месте
1) Найти этот первый отрицательный элемент. Запомнить его индекс.
2) Представить, что массив теперь - это два массива. Один начинается с начала и имеет размер == индексу первого отрицательного элемента. Второй - начинается со следующего элемента за первым отрицательным и заканчивается там, где заканчивался исходный массив.
3) Отсортировать оба новых массива, каждый как требуется.
0
MakItSim
18 / 18 / 14
Регистрация: 23.09.2014
Сообщений: 117
25.09.2014, 13:04 #3
Цитата Сообщение от krigan Посмотреть сообщение
Разбираю сортировку выбором. Как реализовать сортировку по возрастанию понял, а как реализовать сортировку по возрастанию до первого отрицательного элемента, а после первого отрицательного сортировать массив по убыванию при этом оставить первый отрицательный элемент на своём месте, не догоняю.
А в чем разница в сортировке по-твоему кроме того, что ты сортируешь, например, не 10 элементов из массива, а 7?
В задаче написано, например:
Цитата Сообщение от krigan Посмотреть сообщение
Найти первое отрицательное число в массиве
Где ты это делаешь?
У тебя функция принимает length_array. По логике, сейчас если ты в length_array передашь любую длину - у тебя отсортируется часть массива этой длины. Сделай этой, найдя позицию отрицательного элемента.
0
zss
Модератор
Эксперт С++
6959 / 6521 / 4139
Регистрация: 18.12.2011
Сообщений: 17,209
Завершенные тесты: 1
25.09.2014, 13:04 #4
Лучший ответ Сообщение было отмечено krigan как решение

Решение

Поступаете просто:

C++
1
2
int repeat_counter;
for (repeat_counter = 0; repeat_counter < length_array && arrayPtr[repeat_counter]>=0 ; repeat_counter++)
После выхода из цикла repeat_counter будет номером первого отрицательного элемента
Далее делаете подобный же цикл , но начиная с repeat_counter+1:
C++
1
for (repeat_counter++; repeat_counter < length_array ; repeat_counter++)
1
MakItSim
25.09.2014, 13:07
  #5

Не по теме:

Цитата Сообщение от krigan Посмотреть сообщение
Обращаюсь с просьбой к Гуру
А что, негуру тебе помочь не могут?

0
krigan
1 / 1 / 3
Регистрация: 31.10.2012
Сообщений: 93
25.09.2014, 13:18  [ТС] #6
А как оставить первый отрицательный элемент на своём месте?
0
MakItSim
18 / 18 / 14
Регистрация: 23.09.2014
Сообщений: 117
25.09.2014, 13:21 #7
Цитата Сообщение от krigan Посмотреть сообщение
А как оставить первый отрицательный элемент на своём месте?
Никак, не трогать его просто сортировать до позиции на один элемент до него. А вторую часть начинать со следующего за ним.
0
zss
Модератор
Эксперт С++
6959 / 6521 / 4139
Регистрация: 18.12.2011
Сообщений: 17,209
Завершенные тесты: 1
25.09.2014, 13:28 #8
Цитата Сообщение от krigan Посмотреть сообщение
А как оставить первый отрицательный элемент на своём месте?
Цитата Сообщение от zss Посмотреть сообщение
Далее делаете подобный же цикл , но начиная с repeat_counter+1:
repeat_counter+1 (+1 именно для этого).
1
krigan
1 / 1 / 3
Регистрация: 31.10.2012
Сообщений: 93
25.09.2014, 14:03  [ТС] #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
35
36
void choicesSort(int* arrayPtr, int length_array) // сортировка выбором
{
    int repeat_counter;
    for (repeat_counter = 0; repeat_counter < length_array && arrayPtr[repeat_counter]>=0 ; repeat_counter++)
 
    {
        int temp = arrayPtr[0]; // временная переменная для хранения значения перестановки
        for (int element_counter = repeat_counter+1; element_counter < length_array; element_counter++)
        {
            if (arrayPtr[repeat_counter] > arrayPtr[element_counter] )
            {
                temp = arrayPtr[repeat_counter];
                arrayPtr[repeat_counter] = arrayPtr[element_counter];
                arrayPtr[element_counter] = temp;
            }
        }
 
    }
 
    for (repeat_counter++; repeat_counter < length_array ; repeat_counter++)
 
    {
        int temp = arrayPtr[0]; // временная переменная для хранения значения перестановки
        for (int element_counter = repeat_counter+1; element_counter < length_array; element_counter++)
        {
            if (arrayPtr[repeat_counter] > arrayPtr[element_counter] )
            {
                temp = arrayPtr[repeat_counter];
                arrayPtr[repeat_counter] = arrayPtr[element_counter];
                arrayPtr[element_counter] = temp;
            }
        }
 
    }
 
}
0
zss
Модератор
Эксперт С++
6959 / 6521 / 4139
Регистрация: 18.12.2011
Сообщений: 17,209
Завершенные тесты: 1
25.09.2014, 14:08 #10
В 26 строке Больше поменяйте на Меньше
1
krigan
1 / 1 / 3
Регистрация: 31.10.2012
Сообщений: 93
25.09.2014, 14:15  [ТС] #11
Не всегда почему-то найденное число остаётся на своём месте, но в большинстве случаев работает правильно. Спасибо.
0
SLADKOV
0 / 0 / 0
Регистрация: 24.02.2015
Сообщений: 1
24.02.2015, 18:18 #12
2.Выполнить предыдущую задачу используя "пузырьковую" сортировку

Помогите сделать..
0
24.02.2015, 18:18
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.02.2015, 18:18
Привет! Вот еще темы с решениями:

Сортировка выбором
Что не так с сортировкой простого выбора????((( #include &lt;iostream&gt; ...

Сортировка выбором
Добрый день, я заметил, что при сортировке массива из N элементов по алгоритму...

Сортировка выбором
#include &quot;stdafx.h&quot; #include&quot;iostream&quot; #include&quot;time.h&quot; using namespace std;...

Сортировка выбором
Обьясните вот эту строчку min = ( a &lt; a ) ? j : min; #include &lt;iostream&gt;...


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

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

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