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

Отсортировать первую треть (или две трети) массива в порядке возрастания, остальную часть - развернуть - C++

Восстановить пароль Регистрация
 
Melany
21 / 4 / 0
Регистрация: 05.07.2015
Сообщений: 125
09.07.2015, 15:04     Отсортировать первую треть (или две трети) массива в порядке возрастания, остальную часть - развернуть #1
Здравствуйте, у меня тут такая задача, я что-то уже совсем запуталась с ней,
Необходимо отсортировать первые две трети массива в порядке возрастания если среднее арифметическое всех элементов больше заданного с клавиатуры значения; иначе - лишь первую треть. Остальную часть массива не сортировать а расположить в обратном порядке.
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>
using namespace std;
void main()
{
const int size=10;
int Mas[size]={8,4,3,5,1,7,9,6,2,5};
int cursize=0;
cout<<"Please enter current size:\t";
cin>>cursize;
int max=Mas[0];
for(int i=0; i<cursize; i++)
{
    if(max<Mas[i])
        max=Mas[i];
}
int index=cursize/3;
int sum=0;
int aver=0;
for(int i=0; i<cursize; i++)
    {
        sum+=Mas[i];
    }
aver=sum/cursize;
int indexf=0;
int temp=0;
if(aver<max)
{
for(int i=0; i<index-1; i++)
    {
        indexf=i+1;
        temp=Mas[indexf];
        for(int j=i+1; j>0; j--)
        {
        if(temp<Mas[j-1])
        {
        Mas[j]=Mas[j-1];
        indexf=j-1;
        }
        Mas[indexf]=temp;
        }
    }
}
int temp1=0;
for(int i=index; i<cursize; i++)
    {
        temp1=Mas[i];
        Mas[i]=Mas[cursize-1];
        Mas[cursize-1]=temp1;
    
    }   
for(int i=0; i<cursize; i++)
    cout<<Mas[i];
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.07.2015, 15:04     Отсортировать первую треть (или две трети) массива в порядке возрастания, остальную часть - развернуть
Посмотрите здесь:

отсортировать массив в порядке возрастания до первого максимального C++
Доделать и исправить. Дано слово из 12 букв. Поменять местами его трети: первую треть разместить на месте третьей, вторую на месте первой и 3 на 2 C++
Отсортировать матрицу в порядке возрастания элементов C++
Нужно отсортировать массив в порядке возрастания C++
Первые десять элементов массива М(30) отсортировать в порядке возрастания, а остальные в порядке убывания C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Maksumko
12 / 12 / 4
Регистрация: 13.06.2015
Сообщений: 60
09.07.2015, 15:52     Отсортировать первую треть (или две трети) массива в порядке возрастания, остальную часть - развернуть #2
Сообщение было отмечено автором темы, экспертом или модератором как ответ
дано массив из 18 чисел , если среднее знач 2/3 массива ( первых 12 чисел ) больше указаного то сортируем ети 2/3, если нет то 1/3 что в конце)

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
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
const int sz = 18;
 
void sortArrayOne(int arr[], int halfPath);
void sortArrayTwo(int arr[], int halfPath);
 
int main()
{
    setlocale(LC_ALL, "rus");
    int myArray[sz];
    float averageNum = 0.0;
    float resAV = 0.0;
    int halfPath = 0;
 
    cout << "\nВведите среднее значение -> ";
    cin >> averageNum;
 
    srand(time(NULL));
    halfPath = (sz / 3) * 2;
 
    //Заповняємо масив
    for (int i = 0; i < sz; i++)
    {
        myArray[i] = rand() % 100 + 1;
    }
    //Виводимо масив
    cout << "\nВыводим массив : \n\n";
    for (int i = 0; i < sz; i++)
    {
        cout << " " << myArray[i];
    }
    //Сумуємо 2/3 масиву не чіпаючи 1/3
    for (int i = 0; i < halfPath; i++)
    {
        resAV += myArray[i];
        if (i == halfPath - 1)
        {
            resAV = resAV / i;
        }
    }
 
    //Провірка нашого значення
    if (resAV > averageNum)
    {
        cout << "\n\nСортируем №1 \n";
        sortArrayOne(myArray, halfPath);
    }
    if (resAV < averageNum)
    {
        cout << "\n\nСортируем №2 \n";
        sortArrayTwo(myArray, halfPath);
    }
 
    //Вивід
    cout << "\n\nВыводим сортированный массив : \n\n";
    for (int i = 0; i < sz; i++)
    {
        cout << " " << myArray[i];
    }
    
    cout << "\n\n";
    return 0;
}
 
void sortArrayOne(int arr[],int halfPath )
{
    int tmp = 0;
 
    for (int i = 0; i < halfPath; i++)
    {
        for (int j = i+1; j < halfPath; j++)
        {
            if (arr[i] > arr[j])
            {
                tmp = arr[i];
                arr[i] = arr[j];
                arr[j] = tmp;
            }
        }
    }
}
 
void sortArrayTwo(int arr[], int halfPath)
{
    int tmp = 0;
 
    for (int i = halfPath; i < sz - 1; i++)
    {
        for (int j = i + 1; j < sz; j++)
        {
            if (arr[i] < arr[j])
            {
                tmp = arr[i];
                arr[i] = arr[j];
                arr[j] = tmp;
            }
        }
    }
}
Melany
21 / 4 / 0
Регистрация: 05.07.2015
Сообщений: 125
10.07.2015, 11:33  [ТС]     Отсортировать первую треть (или две трети) массива в порядке возрастания, остальную часть - развернуть #3
Спасибо большое и действительно не правильно поняла суть задачи, но тем еще есть продолжение... нужно вторую часть отсортировать в противоположном направлении))
Maksumko
12 / 12 / 4
Регистрация: 13.06.2015
Сообщений: 60
10.07.2015, 13:16     Отсортировать первую треть (или две трети) массива в порядке возрастания, остальную часть - развернуть #4
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Добавлено через 32 минуты
вот код который сортирует ( сори есле не так понял )

1 вариант :

2/3 от мин к макс | 1/3 от мак к мин
----------------> | <---------------

2 вариант:

2/3 от макс к мин | 1/3 от мин к макс
<----------------- | ----------------->

есле в if менять знаки можно изменить направление

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
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
const int sz = 18;
 
void sortArrayOne(int arr[], int halfPath);
void sortArrayTwo(int arr[], int halfPath);
void sortSecondPartOne(int arr[], int sz, int halfPath);
void sortSecondPartTwo(int arr[],int halfPath);
 
int main()
{
    setlocale(LC_ALL, "rus");
    int myArray[sz];
    float averageNum = 0.0;
    float resAV = 0.0;
    int halfPath = 0;
 
    cout << "\nВведите среднее значение -> ";
    cin >> averageNum;
 
    srand(time(NULL));
    halfPath = (sz / 3) * 2;
 
    //Заповняємо масив
    for (int i = 0; i < sz; i++)
    {
        myArray[i] = rand() % 100 + 1;
    }
    //Виводимо масив
    cout << "\nВыводим массив : \n\n";
    for (int i = 0; i < sz; i++)
    {
        if (i == 12)
        {
            cout << " |";
        }
        cout << " " << myArray[i];
    }
    //Сумуємо 2/3 масиву не чіпаючи 1/3
    for (int i = 0; i < halfPath; i++)
    {
        resAV += myArray[i];
        if (i == halfPath - 1)
        {
            resAV = resAV / i;
        }
    }
 
    //Провірка нашого значення
    if (resAV > averageNum)
    {
        cout << "\n\nСортируем №1 \n";
        sortArrayOne(myArray, halfPath);
    }
    if (resAV < averageNum)
    {
        cout << "\n\nСортируем №2 \n";
        sortArrayTwo(myArray, halfPath);
    }
 
    //Вивід
    cout << "\n\nВыводим сортированный массив : \n\n";
    for (int i = 0; i < sz; i++)
    {
        if (i == 12)
        {
            cout << " |";
        }
        cout << " " << myArray[i];
    }
 
    cout << "\n\n";
    return 0;
}
 
void sortArrayOne(int arr[], int halfPath)
{
    int tmp = 0;
 
    for (int i = 0; i < halfPath-1; i++)
    {
        if (i == halfPath - 2)
        {
            sortSecondPartOne(arr, sz, halfPath);
        }
        for (int j = i + 1; j < halfPath; j++)
        {
            if (arr[i] > arr[j])
            {
                tmp = arr[i];
                arr[i] = arr[j];
                arr[j] = tmp;
            }           
        }       
    }
}
 
void sortArrayTwo(int arr[], int halfPath)
{
    int tmp = 0;
    sortSecondPartTwo(arr, halfPath);
 
    for (int i = halfPath; i < sz - 1; i++)
    {
        for (int j = i + 1; j < sz; j++)
        {
            if (arr[i] > arr[j])
            {
                tmp = arr[i];
                arr[i] = arr[j];
                arr[j] = tmp;
            }
        }
    }
}
 
void sortSecondPartOne(int arr[], int sz, int halfPath)
{
    int tmp = 0;
 
    for (int i = halfPath; i < sz-1; i++)
    {
        for (int j = i + 1; j < sz; j++)
        {
            if (arr[i] < arr[j])
            {
                tmp = arr[i];
                arr[i] = arr[j];
                arr[j] = tmp;
            }
        }
    }
}
 
void sortSecondPartTwo(int arr[],int halfPath)
{
    int tmp = 0;
 
    for (int i = 0; i < halfPath - 1; i++)
    {
        for (int j = i + 1; j < halfPath; j++)
        {
            if (arr[i] < arr[j])
            {
                tmp = arr[i];
                arr[i] = arr[j];
                arr[j] = tmp;
            }
        }
    }
}
Добавлено через 5 минут
C++
1
2
3
4
5
6
//Заголовочные файлы
#include <iostream>
#include <cstdlib> //for rand()
#include <ctime> //for srand(time(NULL));
 
using namespace std;
Melany
21 / 4 / 0
Регистрация: 05.07.2015
Сообщений: 125
10.07.2015, 14:29  [ТС]     Отсортировать первую треть (или две трети) массива в порядке возрастания, остальную часть - развернуть #5
Спасибо, только у меня еще один вопрос, поскольку я еще не со всем тем что написано у тебя знакома, я по своему хочу вторую часть сделать, но почему-то не получается, это часть где нужно остаток то есть 1/3 массива расположить в обратном порядке.
Извини что надоедаю, но я с этим несколько часов уже сижу, где у меня тут ошибка?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
int Mas[size]={8,4,3,5,1,7,9,6,2,5,7,3};
int segment=(cursize/3)*2
int cursize=12;
 
for(int i=segment; i<cursize; i++)
    {
        for (int j = cursize-1; j>segment; j--)
        {
        int temp1=Mas[i];
        Mas[i]=Mas[j];
        Mas[j]=temp1;
        
        }
    }
for(int i=0; i<cursize; i++)
    {
cout<<Mas[i];
}
Maksumko
12 / 12 / 4
Регистрация: 13.06.2015
Сообщений: 60
10.07.2015, 14:40     Отсортировать первую треть (или две трети) массива в порядке возрастания, остальную часть - развернуть #6
надо int cursize=12; определять первым а потом уже его использовать

Добавлено через 50 секунд
вот так

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
int Mas[12] = { 8, 4, 3, 5, 1, 7, 9, 6, 2, 5, 7, 3 };
    int cursize = 12;
    int segment = (cursize / 3) * 2;
        
 
    for (int i = segment; i<cursize; i++)
    {
        for (int j = cursize - 1; j>segment; j--)
        {
            int temp1 = Mas[i];
            Mas[i] = Mas[j];
            Mas[j] = temp1;
 
        }
    }
    for (int i = 0; i < cursize; i++)
    {
        cout << Mas[i];
    }
но кажись он у вас не правильно сортирует
Melany
21 / 4 / 0
Регистрация: 05.07.2015
Сообщений: 125
10.07.2015, 14:52  [ТС]     Отсортировать первую треть (или две трети) массива в порядке возрастания, остальную часть - развернуть #7
Оно и так и так не работает, я не понимаю почему, переменная j не меняется,,,,

for(int i=segment; i<cursize; i++)
{
for (int j = cursize-1; j>segment; j--)
{
int temp1=Mas[i];
Mas[i]=Mas[j];
Mas[j]=temp1;
break;
}
}
Maksumko
12 / 12 / 4
Регистрация: 13.06.2015
Сообщений: 60
10.07.2015, 14:52     Отсортировать первую треть (или две трети) массива в порядке возрастания, остальную часть - развернуть #8
не меняеться потому что у вас есть break; ето = выход из цикла и при входе создаете новую переменную j
, приблизительно так :

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
int main()
{
    int Mas[12] = { 8, 4, 3, 5, 1, 7, 9, 6, 2, 5, 7, 3 };
    int cursize = 12;
    int segment = (cursize / 3) * 2;
 
 
    for (int i = segment; i<cursize-1; i++)//і буде йти до cursize-1
    {
        for (int j = i+1; j < cursize ; j++)//j присвоїли і+1 і будемо йти поки j < cursize
        {
            if (Mas[i] > Mas[j]) //провіряємо елемент за індексом і з всіма за індексом j
            {
                int temp1 = Mas[i];//ну тут все зрозуміло
                Mas[i] = Mas[j];
                Mas[j] = temp1;
            }
        }
    }
    for (int i = 0; i < cursize; i++)//виводимо 
    {
        cout << Mas[i] << " ";
    }
 
    cout << "\n\n";
    return 0;
}
Melany
21 / 4 / 0
Регистрация: 05.07.2015
Сообщений: 125
10.07.2015, 15:09  [ТС]     Отсортировать первую треть (или две трети) массива в порядке возрастания, остальную часть - развернуть #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
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
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
#include<iostream>
using namespace std;
void main()
{
const int size=12;
int Mas[size]={8,4,3,5,1,7,9,6,2,5,7,3};
int cursize=12;
cout<<"Please enter current size:\t";
cin>>cursize;
int max;
cout<<"Please enter digit:\t";
cin>>max;
int sum=0;
int segment=(cursize/3)*2;
for(int i=0; i<segment; i++)
    {
        sum+=Mas[i];
    
        if(i==segment-1)
        {
                sum=sum/segment;
        }
    }
int indexf=0;
int temp=0;
int radius=cursize/3;
if(max<sum)
{
     for (int i = 0; i < segment; i++)
    {
        for (int j = i; j < segment; j++)
        {
            if (Mas[i] > Mas[j])
            {
                temp = Mas[i];
                Mas[i] = Mas[j];
                Mas[j] = temp;
            }
        }
    }
 
for(int i=segment; i<cursize; i++)
    {
        for (int j = cursize-1; j>segment; j--)
        {
        int temp1=Mas[i];
        Mas[i]=Mas[j];
        Mas[j]=temp1;
        break;
        }
    }
for(int i=0; i<cursize; i++)
    {
    cout<<Mas[i];
    }
}
if(max>sum)
{
     for (int i = 0; i < radius; i++)
    {
        for (int j = i; j < radius; j++)
        {
            if (Mas[i] > Mas[j])
            {
                temp = Mas[i];
                Mas[i] = Mas[j];
                Mas[j] = temp;
            }
        }
    }
 
for(int i=radius; i<cursize; i++)
    {
        for (int j = cursize-1; j>radius; j--)
        {
        int temp1=Mas[i];
        Mas[i]=Mas[j];
        Mas[j]=temp1;
        
        }
    }
for(int i=0; i<cursize; i++)
    {
    cout<<Mas[i];
    }
}
}
Добавлено через 5 минут
я не про построение по порядку возрастания, а про расположение в обратном порядке., то есть

int Mas[size]={8,4,3,5,1,7,9,6,2,5,7,3}
сортируем конец то есть 1/3

должно получиться:
int Mas[size]={8,4,3,5,1,7,9,6,3,7,5,2}

Добавлено через 10 минут
Вы мне построение с возрастанием объясняете, спасибо, но мне не нужно проверять эти переменные а просто переставить их в обратном порядке,,
вот тут у меня беда
Maksumko
12 / 12 / 4
Регистрация: 13.06.2015
Сообщений: 60
10.07.2015, 15:47     Отсортировать первую треть (или две трети) массива в порядке возрастания, остальную часть - развернуть #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
27
28
29
30
31
32
33
34
35
36
//=============================================================
if (max < sum)
{
    cout << "\nV 1 \n\n";
    
    for (int i = 0; i < segment; i++)
    {
        for (int j = i; j < segment; j++)
        {
            if (Mas[i] > Mas[j])
            {
                temp = Mas[i];
                Mas[i] = Mas[j];
                Mas[j] = temp;
            }
        }
    }
 
    for (int i = segment; i < cursize;)
    {
        for (int j = cursize - 1; j > segment + 1;)
        {
            int temp1 = Mas[i];
            Mas[i] = Mas[j];
            Mas[j] = temp1;
            j--;
            i++;
            continue;
        }
    }
 
    for (int i = 0; i<cursize; i++)
    {
        cout << Mas[i]<<" ";
    }
}
Добавлено через 15 минут
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
//=============================================================
if (max > sum)
{
    cout << "\nV 2 \n\n";
    for (int i = radius; i<cursize; i++)
    {
        for (int j = cursize - 1; j>radius; j--)
        {
            int temp1 = Mas[i];
            Mas[i] = Mas[j];
            Mas[j] = temp1;
 
        }
    }
 
    for (int i = radius; i<cursize; i++)
    {
        for (int j = cursize - 1; j>radius; j--)
        {
            temp = Mas[i];
            Mas[i] = Mas[j];
            Mas[j] = temp;
            j--;
            if (i == j)
            {
                i = 0123;//eror code
                break;
            }
            i++;
            continue;
         }
 
        if (i == 0123)
        {
            break;
        }
    }
    for (int i = 0; i < cursize; i++)
    {
        cout << Mas[i] << " ";
    }
}
//=============================================================
Melany
21 / 4 / 0
Регистрация: 05.07.2015
Сообщений: 125
10.07.2015, 15:48  [ТС]     Отсортировать первую треть (или две трети) массива в порядке возрастания, остальную часть - развернуть #11
Спасибо огромное!!!!!!!!!!
Maksumko
12 / 12 / 4
Регистрация: 13.06.2015
Сообщений: 60
10.07.2015, 16:07     Отсортировать первую треть (или две трети) массива в порядке возрастания, остальную часть - развернуть #12
извините ошибся чуток ((( во 2 блоке из за
C++
1
2
3
4
5
6
7
8
9
10
for (int i = radius; i<cursize; i++)
    {
        for (int j = cursize - 1; j>radius; j--)
        {
            int temp1 = Mas[i];
            Mas[i] = Mas[j];
            Mas[j] = temp1;
 
        }
    }
не правильно сортирует есле и стереть то все норм

и забыл стереть j-- и i++.
правильно так

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
for (int i = radius; i < cursize;)
    {
        for (int j = cursize - 1; j > radius+1;)
        {
            temp = Mas[i];
            Mas[i] = Mas[j];
            Mas[j] = temp;
            j--;
            if (i == j)
            {
                i = 0123;//eror code
                break;
            }
            i++;
            continue;
        }
 
        if (i == 0123)
        {
            break;
        }
    }
Melany
21 / 4 / 0
Регистрация: 05.07.2015
Сообщений: 125
10.07.2015, 16:13  [ТС]     Отсортировать первую треть (или две трети) массива в порядке возрастания, остальную часть - развернуть #13
а что это такое?
(i == 0123)

Код ошибки, какой?
Maksumko
12 / 12 / 4
Регистрация: 13.06.2015
Сообщений: 60
10.07.2015, 16:15     Отсортировать первую треть (или две трети) массива в порядке возрастания, остальную часть - развернуть #14
когда і == j мы делаем break; но выходим только из 2 цикла чтоб выйти из 1 присвоили і значение 0123 и теперь когда і == 0123 мы выйдем и из 1 цикла.
Melany
21 / 4 / 0
Регистрация: 05.07.2015
Сообщений: 125
10.07.2015, 16:20  [ТС]     Отсортировать первую треть (или две трети) массива в порядке возрастания, остальную часть - развернуть #15
то есть вместо i= 0123 можно присвоить i= 52142 Я правильно понимаю?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.07.2015, 17:47     Отсортировать первую треть (или две трети) массива в порядке возрастания, остальную часть - развернуть
Еще ссылки по теме:

C++ Отсортировать слова в строке в порядке возрастания
C++ Отсортировать в порядке возрастания все положительные элементы массива
В массиве отсортировать в порядке возрастания каждую из строк C++

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

Или воспользуйтесь поиском по форуму:
Maksumko
12 / 12 / 4
Регистрация: 13.06.2015
Сообщений: 60
10.07.2015, 17:47     Отсортировать первую треть (или две трети) массива в порядке возрастания, остальную часть - развернуть #16
угу
Yandex
Объявления
10.07.2015, 17:47     Отсортировать первую треть (или две трети) массива в порядке возрастания, остальную часть - развернуть
Ответ Создать тему
Опции темы

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