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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 14, средняя оценка - 4.79
@-Lex
Сообщений: n/a
#1

Отсортировать элементы массива по возрастанию с сохранением позиций нулей - C++

13.09.2009, 22:52. Просмотров 1746. Ответов 11
Метки нет (Все метки)

Хелп!Не могу никак написать правильный код...вот условие:отсортировать элементы массива (отрицательные влево,положительные вправо,т.е. не изменяя порядка следования элементов) с сохранением позиций нулей,без использования дополнительных массивов
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.09.2009, 22:52
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Отсортировать элементы массива по возрастанию с сохранением позиций нулей (C++):

Элементы массива с нечетных позиций необходимо отсортировать по возрастанию, с четных - по убыванию - C++
Значит есть одномерный массив из 10 чисел. Заполнен случайными значениями. Числа расположенные на нечетных позициях необходимо...

Отсортировать по возрастанию элементы массива - C++
1)Дан массив целых чисел из 10 элементов отсортировать по возрастанию. 2)Дан действительный массив A.Напечатать индекс его отрицательных...

Отсортировать элементы массива по возрастанию - C++
Здравствуйте,нужна программа на массиве одномерном. Задание: Задан массив из k чисел. Отсортировать элементы массива по возрастанию

Отсортировать элементы массива по возрастанию - C++
Задан массив из k чисел. Отсортировать элементы массива по возрастанию.

Отсортировать по возрастанию элементы массива - C++
В массиве А каждый элемент изменяется в пределах от 0 .. 20. Отсортировать по возрастанию. C++

Отсортировать элементы главной диагонали массива по возрастанию - C++
Заполнить двумерный числовой массив А целыми числами. Отсортировать элементы главной диагонали массива по возрастанию и выделить красным...

11
Monte-Cristo
2789 / 1375 / 30
Регистрация: 07.03.2009
Сообщений: 4,446
14.09.2009, 00:21 #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
#include <iostream>
using namespace std;
 
int main()
{
    const int n = 8;
    int A[n] = {23, 0, -5, 0, 9, 12, 0, -1};
    
    for (int i=0; i<n-1; i++)
    {
        if (A[i]==0) continue;
        for (int j=i+1; j<n; j++)
        {
            if (A[j]==0) continue;
            if (A[i] > A[j])
            {
                int t=A[i];
                A[i] = A[j];
                A[j] = t;
            }
        }
    }
    
    for (int i=0; i<n; i++)
        cout << A[i] << "\t";
        
 
    return 0;
}
0
M128K145
Эксперт С++
8289 / 3509 / 143
Регистрация: 03.07.2009
Сообщений: 10,706
14.09.2009, 00:48 #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
#include <iostream>
 
short Left_Pos(int* mas, short n, short cur)
{
    short i;
    for(i = cur; i < n; ++i)
        if(mas[i] < 0)
            return i;
    return -1;
}
short Right_Pos(int* mas, short n, short cur)
{
    short i;
    for(i = cur; i < n; ++i)
        if(mas[i] > 0)
            return i;
    return -1;
}
int main()
{
    setlocale(LC_ALL, "Russian");
    short n(10), i;
    int mas[] = { 5, 0, 6, 8, 9, -1, -6, 4, -3, -8 };
    std::cout<<"Введите элементы массива:\n";
    for(i = 0; i < n; ++i)
        std::cout<<mas[i]<<' ';
    std::cout<<'\n';
    short pos_l(0), pos_r(0), ind_fp(0); 
 
    for(i = 0; i < n/2+1; ++i)
    {
        pos_l = Left_Pos(mas, n, pos_l);
        pos_r = Right_Pos(mas, n , pos_r);
        if(pos_l != -1 && pos_r != -1)
        {
            if(pos_l > pos_r)
                mas[pos_l] ^= mas[pos_r] ^= mas[pos_l] ^= mas[pos_r];
        }
        else
            break;
    }
    for(i = 0; i < n; ++i)
        std::cout<<mas[i]<<' ';
 
    std::cout<<'\n';
    system("pause");
    return 0;
}
, но дело в том, что надо сохранить порядок как нулей, так и отрицательных и положительных элементов
0
Monte-Cristo
2789 / 1375 / 30
Регистрация: 07.03.2009
Сообщений: 4,446
14.09.2009, 01:15 #4
M128K145, значит я не так понял.
0
mirso
525 / 343 / 17
Регистрация: 05.04.2009
Сообщений: 709
14.09.2009, 03:34 #5
@-Lex,
Цитата Сообщение от @-Lex Посмотреть сообщение
отсортировать элементы массива
сортировка
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
#include <iostream>
#include <iomanip>
using namespace std;
//======================================================== 
int main()
{
const unsigned short n = 11;
int A[n] = { 23, -5, 0, 333, 0, 9, 12, -17, 4, 0, -1 };
 
    for ( size_t i = 0; i < n; i++ ) 
    cout << setw(3)<< A[i] << " ";
    cout << endl;
    
    //---------------------------------------------------
    for ( size_t i = 0; i < n; i++ )
    {
    if ( A[i] == 0 )continue; 
    if ( A[i]  < 0 )
        for ( int j = i; j >= 0; j-- )
        {           
            if ( A[j] == 0 )continue; 
        if ( A[j]  > 0 )            
            {
                int t = A[i];
                 A[i] = A[j]; 
                 A[j] =    t;
         i = j; 
            }
        }
    }//---------------------------------------------------
    for ( size_t i = 0; i < n; i++ ) 
    cout << setw(3)<< A[i] << " "; cout << endl;
        
system ( "pause" ); 
return 0;
}//=======================================================
0
odip
Эксперт С++
7157 / 3219 / 59
Регистрация: 17.06.2009
Сообщений: 14,164
15.09.2009, 15:58 #6
сохранить порядок как нулей
То есть если у нас есть 500 нулей, то мы не должны их перемешивать ?
0
M128K145
Эксперт С++
8289 / 3509 / 143
Регистрация: 03.07.2009
Сообщений: 10,706
15.09.2009, 16:01 #7
odip, именно, mirso примерно правильно соорудил решение
0
odip
Эксперт С++
7157 / 3219 / 59
Регистрация: 17.06.2009
Сообщений: 14,164
15.09.2009, 16:05 #8
Так правильно или примерное правильно ?
Встроенный тест считает правильно.
0
CheshireCat
Эксперт С++
2893 / 1242 / 78
Регистрация: 27.05.2008
Сообщений: 3,375
15.09.2009, 16:19 #9
На C++ (это же ++, не правда ли? ) все еще проще:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <iostream>
#include <algorithm>
using namespace std;
 
int main()
{
    const int n = 8;
    int A[n] = {23, 0, -5, 0, 9, 12, 0, -1};
 
    stable_sort(A, A + n);
 
    for (int i=0; i<n; i++)
        cout << A[i] << "\t";
 
     return 0;
}
0
mirso
525 / 343 / 17
Регистрация: 05.04.2009
Сообщений: 709
16.09.2009, 00:27 #10
CheshireCat,
Цитата Сообщение от CheshireCat Посмотреть сообщение
это же ++, не правда ли?
Цитата Сообщение от @-Lex Посмотреть сообщение
с сохранением позиций нулей
у тебя вывод такой
23 0 -5 0 9 12 0 -1//до
-5 -1 0 0 0 9 12 23//после
а нужен такой
23 0 -5 0 9 12 0 -1//до
-5 0 -1 0 23 9 0 12//после
0
wolff-87
3 / 3 / 0
Регистрация: 18.08.2009
Сообщений: 40
16.09.2009, 15:25 #11
Народ а так?Громоздко.Но кажется правильно.
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
#include <stdio.h>
#include "stdafx.h"
 
#include <cstdio>
#include <iostream>
using namespace std;
    int main()
{
    int a[15]={0,-1,0,1,-9,0,-5,23,-4,0,-7,-2,13,2,0};
    
    int i,k,c,b,q=15;
 
    for(i=0;i<q;i++)
    {
        if(a[i]==0)continue;
        if(a[i]<0)
        {
            for(k=0;k<i;k++)
            {
                if(a[k]<0 ||a[k]==0)continue;
                if(a[k]>0)
                {
                    c=a[i];
                    for(;k<i+1;k++)
                    {
                        if(a[k]!=0)
                        {
                            b=a[k];
                            a[k]=c;
                            c=b;
                        }
                    }
                }
            }
        }
    }
    for(i=0;i<q;i++)
        {
            cout<<a[i]<<" ";
        }
        
        
 
 
system("pause");
return 0;
 }
Добавлено через 3 минуты
Хотя пожалуй Mirso cделал лучше.
0
CheshireCat
Эксперт С++
2893 / 1242 / 78
Регистрация: 27.05.2008
Сообщений: 3,375
16.09.2009, 15:27 #12
Хм, ну, значит, я не понял/невнимательно прочитал условие задачи.../косноязычно составлено... и т.п. Тогда приведенный мною код не годится.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.09.2009, 15:27
Привет! Вот еще темы с ответами:

Отсортировать по возрастанию только четные элементы массива - C++
№1: Отсортировать по возрастанию только четные элементы массива. У меня массив сам выводится, но сортироваться не хочет, помогите...

Отсортировать элементы массива по возрастанию методом обмена - C++
Отсортировать элементы массива по возрастанию методом обмена. есть код, int *mas; int n; void mas_in() { int i;...

Отсортировать по возрастанию только положительные элементы массива - C++
Отсортировать по возрастанию только положительные элементы массива. Как объяснил преподаватель так чтобы положительные отсортировались а...

Отсортировать четные элементы массива по возрастанию, а нечетные по убыванию - C++
помогите найти ошибку.не верно сортирует. #include &lt;iostream&gt; #include &lt;math.h&gt; #include&lt;stdlib.h&gt; #include&lt;conio.h&gt; ...


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

Или воспользуйтесь поиском по форуму:
12
Yandex
Объявления
16.09.2009, 15:27
Ответ Создать тему
Опции темы

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