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

C++, одномерный массив, сортировка. - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 5.00
HenryL
2 / 2 / 0
Регистрация: 14.04.2010
Сообщений: 32
20.04.2010, 14:38     C++, одномерный массив, сортировка. #1
Приветствую!
Подскажите, как сформировать массивы X и Y в задании:

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


Сортировка массива всегда давалась мне с трудом, а тут, как мне кажется, не совсем стандартная задача поставлена.
Буду благодарен за подсказку
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
valeriikozlov
Эксперт C++
 Аватар для valeriikozlov
4660 / 2486 / 321
Регистрация: 18.08.2009
Сообщений: 4,550
20.04.2010, 16:22     C++, одномерный массив, сортировка. #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 немного подумайте и тоже получится.
uggway
219 / 133 / 9
Регистрация: 12.04.2010
Сообщений: 248
20.04.2010, 16:43     C++, одномерный массив, сортировка. #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
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9383 / 5433 / 916
Регистрация: 25.07.2009
Сообщений: 10,428
20.04.2010, 16:54     C++, одномерный массив, сортировка. #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 Посмотреть сообщение
в центр ставиться самый большой элемент, от него «расходятся» в разные стороны меньшие элементы
HenryL
2 / 2 / 0
Регистрация: 14.04.2010
Сообщений: 32
20.04.2010, 17:12  [ТС]     C++, одномерный массив, сортировка. #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, поэтому, по возможности, как можно проще, пожалуйста.
valeriikozlov
Эксперт C++
 Аватар для valeriikozlov
4660 / 2486 / 321
Регистрация: 18.08.2009
Сообщений: 4,550
20.04.2010, 19:56     C++, одномерный массив, сортировка. #6
Цитата Сообщение от HenryL Посмотреть сообщение
Спасибо, сейчас попробую разобраться. Правда некоторые операторы мне еще не известны
Тогда лучше не пытайтесь пока разбираться с тем что написал easybudda. Оставьте изучение STL на потом. Попытайтесь написать то что нужно языком который Вам знаком.
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9383 / 5433 / 916
Регистрация: 25.07.2009
Сообщений: 10,428
20.04.2010, 20:12     C++, одномерный массив, сортировка. #7
valeriikozlov, а по-моему зря... Все эти "хитроумные" конструкции STL только на первый взгляд на марсианский язык похожи. Если в них разобраться, приложив при этом совсем небольшое усилие, многие задачи решать станет гораздо проще...
valeriikozlov
Эксперт C++
 Аватар для valeriikozlov
4660 / 2486 / 321
Регистрация: 18.08.2009
Сообщений: 4,550
20.04.2010, 20:48     C++, одномерный массив, сортировка. #8
easybudda, Как я убедился, есть задачи которые можно решить с использованием STL, но невозможно решить без использования STL. Но если рассматривать глубже, все файлы, написанные для обеспечения возможности использования STL, написаны на простом языке C++. О чем это говорит. - Все что написано с использованием STL, можно писать и без использования STL!!!
Но хочу заметить что я ни в коем случае не против STL, а наоборот я только за использование этой библиотеки. Но в данном случае нужно учитывать уровень того кто задал вопрос.
easybudda
20.04.2010, 22:04
  #9

Не по теме:

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

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

Все остальное сам добавь т.е. main и т.д.
HenryL
2 / 2 / 0
Регистрация: 14.04.2010
Сообщений: 32
22.04.2010, 16:46  [ТС]     C++, одномерный массив, сортировка. #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] << "";
не получается...
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.04.2010, 19:10     C++, одномерный массив, сортировка.
Еще ссылки по теме:

Одномерный массив. Вычисление произведения элементов. Сортировка. C++
Задача на одномерный массив (сортировка) C++
Одномерный массив, сортировка C++
C++ Одномерный массив. Сортировка и запись массива в другой файл
Целочисленный одномерный массив, сортировка по убыванию и возрастанию C++

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

Или воспользуйтесь поиском по форуму:
uggway
219 / 133 / 9
Регистрация: 12.04.2010
Сообщений: 248
22.04.2010, 19:10     C++, одномерный массив, сортировка. #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;
}
//---------------------------------------------------------------------------
Yandex
Объявления
22.04.2010, 19:10     C++, одномерный массив, сортировка.
Ответ Создать тему
Опции темы

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