Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/7: Рейтинг темы: голосов - 7, средняя оценка - 5.00
2 / 2 / 0
Регистрация: 14.04.2010
Сообщений: 32
1

Одномерный массив, сортировка

20.04.2010, 14:38. Показов 1469. Ответов 11
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Приветствую!
Подскажите, как сформировать массивы X и Y в задании:

Заданы массив {bi}; i=1,n. Подсчитать количество нулевых элементов массива. Сформировать новые массивы – X,Y, содержащие ранжированные элементы исходного массива:
X – 1-ый элемент – самый большой, последний элемент – второй с наибольший элемент, 3-й элемент – третий наибольший, предпоследний элемент – четвертый наибольший и т.д.
Y – в центр ставиться самый большой элемент, от него «расходятся» в разные стороны меньшие элементы


Сортировка массива всегда давалась мне с трудом, а тут, как мне кажется, не совсем стандартная задача поставлена.
Буду благодарен за подсказку
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
20.04.2010, 14:38
Ответы с готовыми решениями:

Одномерный массив, сортировка
Вот задание. Надеюсь на помощь. Вот что у самого получилось... Что делать дальше?...

Одномерный массив.замна и сортировка.
В одномерном массиве, состоящем из n вещественных элементов. Заменить все отрицательные элементы...

Задача на одномерный массив (сортировка)
Помоги тебе решить задачу, пожалуйста. Дан одномерный массив из N элементов. Не заводя...

Одномерный массив - сортировка по убыванию
написать программу, которая методом обмена сортирует по убыванию введенный с клавиатуры одномерный...

11
Эксперт С++
4727 / 2548 / 757
Регистрация: 18.08.2009
Сообщений: 4,568
20.04.2010, 16:22 2
Предлагаю так:
1. Исходный массив сортируем по убыванию.
2. Создаем массив X, заводим две переменные: i_l=0, i_r=n-1. Затем запускаем цикл for(i=0; i<n; i++)
если i четное, то элементу X[i_l] присваиваем значение элемента исходного массива с индексом i и увеличиваем i_l на единицу, если i нечетное, то элементу X[i_r] присваиваем значение элемента исходного массива с индексом i и уменьшаем i_r на единицу.
С массивом Y немного подумайте и тоже получится.
1
221 / 135 / 48
Регистрация: 12.04.2010
Сообщений: 248
20.04.2010, 16:43 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
#include<algorithm>
 
#define SZ 9
int a[SZ]={1,12,3,41,15,64,7,8,9};
int b[SZ], c[SZ];
int e = 0,i = SZ-1;
 
sort(a,a+SZ);//сортируем... по возрастанию :)
do
{
    b[e] = a[i--];
    b[SZ - 1 - e] = a[i--];
    e++;
 
} while(e < SZ/2);
if(SZ%2) b[SZ/2] = a[0]; //1
e = 0; i = SZ-1;
if(SZ%2) c[SZ/2] = a[i];
do{
    c[SZ/2+e] = a[i--];
    if(e)c[SZ/2-e] = a[i--];
    e++;
 
}while(e < SZ/2);
if(SZ%2){c[SZ-1] = a[i];c[0]=a[0];}else c[0] = a[0];//2
1
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
12457 / 7481 / 1753
Регистрация: 25.07.2009
Сообщений: 13,759
20.04.2010, 16:54 4
Цитата Сообщение от HenryL Посмотреть сообщение
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
#include <iostream>
#include <set>
#include <algorithm>
#include <iterator>
 
int main(){
    const int SIZE = 10;
    int arr[SIZE] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
    std::cout << "Array: ";
    std::copy(arr, arr + SIZE, std::ostream_iterator<int>(std::cout, " "));
    std::cout << std::endl;
 
    int *l, *r, *p;
    bool left;
    std::set<int, std::greater<int> > s;
    for ( int i = 0; i < SIZE; ++i )
        s.insert(arr[i]);
    l = arr;
    r = arr + SIZE - 1;
    left = true;
    while ( !s.empty() ){
        if ( left )
            p = l++;
        else
            p = r--;
        left = !left;
        *p = *s.begin();
        s.erase(s.begin());
    }
    std::cout << "Result: ";
    std::copy(arr, arr + SIZE, std::ostream_iterator<int>(std::cout, " "));
    std::cout << std::endl;
 
    return 0;
}
если
C++
1
std::set<int, std::greater<int> > s;
заменить на
C++
1
std::set<int, std::less<int> > s;
получится
Цитата Сообщение от HenryL Посмотреть сообщение
в центр ставиться самый большой элемент, от него «расходятся» в разные стороны меньшие элементы
1
2 / 2 / 0
Регистрация: 14.04.2010
Сообщений: 32
20.04.2010, 17:12  [ТС] 5
Цитата Сообщение от valeriikozlov Посмотреть сообщение
Предлагаю так:
1. Исходный массив сортируем по убыванию.
2. Создаем массив X, заводим две переменные: i_l=0, i_r=n-1. Затем запускаем цикл for(i=0; i<n; i++)
если i четное, то элементу X[i_l] присваиваем значение элемента исходного массива с индексом i и увеличиваем i_l на единицу, если i нечетное, то элементу X[i_r] присваиваем значение элемента исходного массива с индексом i и уменьшаем i_r на единицу.
С массивом Y немного подумайте и тоже получится.
спасибо, попробую этот алгоритм

Цитата Сообщение от uggway Посмотреть сообщение
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
#include<algorithm>
 
#define SZ 9
int a[SZ]={1,12,3,41,15,64,7,8,9};
int b[SZ], c[SZ];
int e = 0,i = SZ-1;
 
sort(a,a+SZ);//сортируем... по возрастанию :)
do
{
    b[e] = a[i--];
    b[SZ - 1 - e] = a[i--];
    e++;
 
} while(e < SZ/2);
if(SZ%2) b[SZ/2] = a[0]; //1
e = 0; i = SZ-1;
if(SZ%2) c[SZ/2] = a[i];
do{
    c[SZ/2+e] = a[i--];
    if(e)c[SZ/2-e] = a[i--];
    e++;
 
}while(e < SZ/2);
if(SZ%2){c[SZ-1] = a[i];c[0]=a[0];}else c[0] = a[0];//2
сложно написано, не все понял =)
Наш Visual Studio не компилирует.

Цитата Сообщение от easybudda Посмотреть сообщение
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
#include <iostream>
#include <set>
#include <algorithm>
#include <iterator>
 
int main(){
    const int SIZE = 10;
    int arr[SIZE] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
    std::cout << "Array: ";
    std::copy(arr, arr + SIZE, std::ostream_iterator<int>(std::cout, " "));
    std::cout << std::endl;
 
    int *l, *r, *p;
    bool left;
    std::set<int, std::greater<int> > s;
    for ( int i = 0; i < SIZE; ++i )
        s.insert(arr[i]);
    l = arr;
    r = arr + SIZE - 1;
    left = true;
    while ( !s.empty() ){
        if ( left )
            p = l++;
        else
            p = r--;
        left = !left;
        *p = *s.begin();
        s.erase(s.begin());
    }
    std::cout << "Result: ";
    std::copy(arr, arr + SIZE, std::ostream_iterator<int>(std::cout, " "));
    std::cout << std::endl;
 
    return 0;
}
если
C++
1
std::set<int, std::greater<int> > s;
заменить на
C++
1
std::set<int, std::less<int> > s;
получится
Спасибо, сейчас попробую разобраться. Правда некоторые операторы мне еще не известны

Добавлено через 7 минут
Я на начальном этапе изучения cpp, поэтому, по возможности, как можно проще, пожалуйста.
0
Эксперт С++
4727 / 2548 / 757
Регистрация: 18.08.2009
Сообщений: 4,568
20.04.2010, 19:56 6
Цитата Сообщение от HenryL Посмотреть сообщение
Спасибо, сейчас попробую разобраться. Правда некоторые операторы мне еще не известны
Тогда лучше не пытайтесь пока разбираться с тем что написал easybudda. Оставьте изучение STL на потом. Попытайтесь написать то что нужно языком который Вам знаком.
0
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
12457 / 7481 / 1753
Регистрация: 25.07.2009
Сообщений: 13,759
20.04.2010, 20:12 7
valeriikozlov, а по-моему зря... Все эти "хитроумные" конструкции STL только на первый взгляд на марсианский язык похожи. Если в них разобраться, приложив при этом совсем небольшое усилие, многие задачи решать станет гораздо проще...
0
Эксперт С++
4727 / 2548 / 757
Регистрация: 18.08.2009
Сообщений: 4,568
20.04.2010, 20:48 8
easybudda, Как я убедился, есть задачи которые можно решить с использованием STL, но невозможно решить без использования STL. Но если рассматривать глубже, все файлы, написанные для обеспечения возможности использования STL, написаны на простом языке C++. О чем это говорит. - Все что написано с использованием STL, можно писать и без использования STL!!!
Но хочу заметить что я ни в коем случае не против STL, а наоборот я только за использование этой библиотеки. Но в данном случае нужно учитывать уровень того кто задал вопрос.
0
easybudda
20.04.2010, 22:04
  #9

Не по теме:

Цитата Сообщение от valeriikozlov Посмотреть сообщение
Все что написано с использованием STL, можно писать и без использования STL!!!
Да можно и на велосипеде без седла ездить. :D
Цитата Сообщение от valeriikozlov Посмотреть сообщение
Но в данном случае нужно учитывать уровень того кто задал вопрос.
Так пускай сразу в правильном направлении развивается... ;)

0
221 / 135 / 48
Регистрация: 12.04.2010
Сообщений: 248
21.04.2010, 09:39 10
HenryL, а что говорит компилятор?
Там написан только код сортировки.
SZ - размер массива
a - входной массив
b - выходной массив по 1 пункту задания
c - выходной массив по 2 пункту

Все остальное сам добавь т.е. main и т.д.
0
2 / 2 / 0
Регистрация: 14.04.2010
Сообщений: 32
22.04.2010, 16:46  [ТС] 11
Цитата Сообщение от uggway Посмотреть сообщение
HenryL, а что говорит компилятор?
Там написан только код сортировки.
SZ - размер массива
a - входной массив
b - выходной массив по 1 пункту задания
c - выходной массив по 2 пункту

Все остальное сам добавь т.е. main и т.д.
Компилятор много чего говорит, не смотря на то, что все заголовки и прочее я сразу добавил)
Какой у вас компилятор?

Сейчас пытаюсь по совету valeriikozlov сформировать Х
C++
1
2
3
4
5
6
7
8
9
10
double *X = new double [n];
for(int i=1;i<n;i++)
{if (i % 2 ==0)
{for (i_l=i;i_l<n;i_l++)
X[i_l]=b[i];}
else {for (i_r=n-1;i_r<n;i_r--)
X[i_r]=b[i];}
// что дальше делать - не знаю
// ...
cout << X[i] << "";
не получается...
0
221 / 135 / 48
Регистрация: 12.04.2010
Сообщений: 248
22.04.2010, 19:10 12
У меня C++Builder, но это не важно в данном случае...
Вот полностью рабочий код...
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
//---------------------------------------------------------------------------
 #include <algorithm>
 #include <iostream>
 
 using namespace std;
 
//---------------------------------------------------------------------------
#define SZ 9
int a[SZ]={1,12,3,41,15,64,7,8,9};
int b[SZ], c[SZ];
int e = 0,i = SZ-1;
void out(int *m)
{
    for(int t=0;t<SZ;t++){
        cout.width(3);
        cout<<m[t]<<" ";
    }
    cout<<endl<<endl;
 
}
 
int main()
{
    out(a);
    sort(a,a+SZ);//сортируем... по возрастанию :)
    out(a);
    do
    {
            b[e] = a[i--];
            b[SZ - 1 - e] = a[i--];
            e++;
 
    } while(e < SZ/2);
    if(SZ%2) b[SZ/2] = a[0]; //1
    out(b);
    e = 0; i = SZ-1;
    if(SZ%2) c[SZ/2] = a[i];
    do{
            c[SZ/2+e] = a[i--];
            if(e)c[SZ/2-e] = a[i--];
            e++;
 
    }while(e < SZ/2);
    if(SZ%2){c[SZ-1] = a[i];c[0]=a[0];}else c[0] = a[0];//2
    out(c);
    cin.get();
    return 0;
}
//---------------------------------------------------------------------------
0
22.04.2010, 19:10
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
22.04.2010, 19:10
Помогаю со студенческими работами здесь

Целочисленный одномерный массив, сортировка по убыванию и возрастанию
Написать программу, позволяющую сортировать введенный пользовате-лем целочисленный одномерный...

Одномерный массив. Вычисление произведения элементов. Сортировка.
В одномерном массиве, состоящем из n вещественных элементов, вычислить: • произведение элементов...

Одномерный массив, сортировка выбором, изменения знака на противоположный
Дан массив С(n). Поменять знаки на противоположные у всех отрицательных элементов массива и...

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


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru