Консультация № 188450
18.12.2015, 19:07
0.00 руб.
0 5 1
Доброго времени суток всем! У меня возник вопрос по такой задаче:

Дан массив A размера N. Не изменяя данный массив, вывести индексы его элементов в том порядке, в котором соответствующие им элементы образуют возрастающую последовательность. Использовать метод «пузырьковой» сортировки. Совет. Создайте вспомогательный целочисленный массив индексов I, заполнив его числами от 0 до N-1. Сравнивая пары элементов массива A, меняйте местами элементы массива I, если левый элемент пары больше правого.

Буду очень признательна за помощь! Если понадобиться, могу прикрепить свой вариант задачи. Может быть кто-нибудь обнаружит незамеченную мной ошибку

Обсуждение

давно
Посетитель
7438
7205
18.12.2015, 21:09
общий
Адресаты:
Здравствуйте! Обязательно давайте свою программу...
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
давно
Посетитель
399319
2
19.12.2015, 10:32
общий
20.12.2015, 15:47
[code h=200]#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#include <time.h>

int main()
{
SetConsoleCP(1251);
SetConsoleOutputCP(1251);

int N;
printf("Введите размер массива:");
scanf("%d", &N);

int i, A[N];
for(i=0; i<N; i++)
{
A[i]=rand()%100;
printf("%d ", A[i]);
}

int B[N], k, ne, e; ///ne - счётчик обменов, e - "обменный пункт"
for (i=0; i<N; i++)
{
A[i]=i;
}

for(k=1; k<=(N-1); k++)
{
ne=0;
for(i=N-1; i>=k; i++)
{
if(A[i]>A[i+1])
{
e=A[i];
A[i]=A[i+1];
A[i+1]=e;
ne=ne+1;
}
i=i-1; ///сдвинуть на след пару
}
if(ne==0)
{
k=N;
}
else
{
k=k+1;
}
}
for(i=0; i<N; i++)
{
printf("%d ", A[i]);
}
return 0;
}
[/code]
давно
Посетитель
7438
7205
20.12.2015, 15:45
общий
это ответ
Здравствуйте, Klaus!
Даю Вам свой вариант, посмотрите, как она работает.
[code h=200]
/*
Дан массив A размера N. Не изменяя данный массив,
вывести индексы его элементов в том порядке,
в котором соответствующие им элементы образуют
возрастающую последовательность.
Использовать метод «пузырьковой» сортировки.
Совет. Создайте вспомогательный целочисленный массив индексов I,
заполнив его числами от 0 до N-1. Сравнивая пары элементов массива A,
меняйте местами элементы массива I, если левый элемент пары больше правого.
*/
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#include <time.h>

#include <malloc.h> //для работы с кучей
#include <conio.h> //для _getch()

int main()
{
SetConsoleCP(1251);
SetConsoleOutputCP(1251);

int N;
printf("Введите размер массива:");
scanf("%d", &N);

int i, j, e;
//Раз N вводится, то массивы будем строить динамически, в куче
int *A = (int*)malloc(N*sizeof(int));
int *idx = (int*)malloc(N*sizeof(int));

//инициализация последовательности псевдослучайных чсел
srand((unsigned)time(NULL));

for(i=0; i<N; i++)
{
idx[i] = i; //индексы вначале равны вводимому порядку
A[i] = rand()%100; //псевдослучайные числа [0,99]
printf("%d ", A[i]); //выведем исходный массив
}
printf("\n"); //на новую строку

//сортировка "пузырьком"
for(i=0; i<N-1; i++)
{
for(j=i+1; j<N; j++)
{
if(A[idx[i]]>A[idx[j]])
{
e = idx[i]; //меняем местами элементы массива индексов
idx[i] = idx[j];
idx[j] = e;
}
}
}

for(i=0; i<N; i++) //выведем индексы отсортированноо массива
{
printf("%d ", idx[i]);
}
printf("\n");

for(i=0; i<N; i++) //значения отсортированного массива
{
printf("%d ", A[idx[i]]);
}
printf("\n");
free(A); //освобождаем память
free(idx);
_getch(); //ждем нажатия, чтобы окно программы "не пропало"
return 0;
}
[/code]
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
давно
Посетитель
7438
7205
20.12.2015, 15:52
общий
20.12.2015, 15:54
Адресаты:
На будущее...
Чтобы сообщение адресовать кому-то лично не надо использовать "цитировать", которое служит, чтобы
напомнить и привести фразу кого-то. Для выбора адресата служит список "Кому". Это раз.
Два. Эксперты, которые "отметились" в мини-форуме и администраор рассылки и так получат сообщение.
Так что, можно не указывать адресата, если сообщение, конечно, не адресовано конкретному эксперту.
Да, для оформления текста программы служит тег "code"
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
давно
Посетитель
399319
2
20.12.2015, 15:58
общий
Большое спасибо, Игорь Витальевич!
Спасибо за подробный разбор задачи!
Форма ответа