powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / почему работает не как надо?
25 сообщений из 42, страница 1 из 2
почему работает не как надо?
    #33737491
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
int a[ 5 ], i, max;
for (i= 0 ;i< 5 ;i++)
{
   cout<<"a["<<i<<"]= ";
   cin>> a[i];
}
for (i= 0 ;i< 5 ;i++) cout<<"a["<<i<<"]= "<<a[i]<<" "; cout<<endl<<endl;
max=a[ 0 ];
for (i= 1 ; i< 5 ;i++)
{
  int j=i;
  while (a[j]>a[j- 1 ] || j== 0 ) 
  {
	max=a[j]; 
	a[j]=a[j- 1 ]; 
	a[j- 1 ]=max;
	j=j- 1 ;
  }
}
max=a[ 4 ];
for (i= 0 ;i< 5 ;i++) cout<<"a["<<i<<"]= "<<a[i]<<" "; cout<<"max="<<max<<endl;
это сортировка по убыванию
...
Рейтинг: 0 / 0
почему работает не как надо?
    #33737537
этот же код (только сортировка по возрастанию) работает правильно:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
int a[ 5 ], i;
for (i= 0 ;i< 5 ;i++)
{
   cout<<"a["<<i<<"]= ";
   cin>> a[i];
}
for (i= 0 ;i< 5 ;i++) cout<<"a["<<i<<"]= "<<a[i]<<" "; cout<<endl<<endl;
int min=a[ 0 ], j;
for (i= 1 ; i< 5 ;i++)
{
    j=i;
    while (a[j]<a[j- 1 ] || j== 0 ) 
    {
	min=a[j]; 
	a[j]=a[j- 1 ]; 
	a[j- 1 ]=min;
	j=j- 1 ;
     }
}
min=a[ 0 ];
for (i= 0 ;i< 5 ;i++) cout<<"a["<<i<<"]= "<<a[i]<<" "; cout<<"min="<<min<<endl;
...
Рейтинг: 0 / 0
почему работает не как надо?
    #33737615
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
int a[ 5 ], i, max;
for (i= 0 ;i< 5 ;i++)
{
   cout<<"a["<<i<<"]= ";
   cin>> a[i];
}
for (i= 0 ;i< 5 ;i++) cout<<"a["<<i<<"]= "<<a[i]<<" "; cout<<endl<<endl;
max=a[ 0 ];
for (i= 4 ; i> 0 ;i--)
{
  int j=i;
  while (a[j]>a[j+ 1 ] || j== 5 ) 
  {
	max=a[j]; 
	a[j]=a[j+ 1 ]; 
	a[j+ 1 ]=max;
	j=j+ 1 ;
  }
}
max=a[ 4 ];
for (i= 0 ;i< 5 ;i++) cout<<"a["<<i<<"]= "<<a[i]<<" "; cout<<"max="<<max<<endl;
cin>>i;
}

Вроде так, протесть хорошенько
...
Рейтинг: 0 / 0
почему работает не как надо?
    #33737617
Dmitrii K.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
случайныйХ
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
int a[ 5 ], i, max;
for (i= 0 ;i< 5 ;i++)
{
   cout<<"a["<<i<<"]= ";
   cin>> a[i];
}
for (i= 0 ;i< 5 ;i++) cout<<"a["<<i<<"]= "<<a[i]<<" "; cout<<endl<<endl;
max=a[ 0 ];
for (i= 1 ; i< 5 ;i++)
{
  int j=i;
  while (a[j]>a[j- 1 ] || j== 0 ) 
  {
	max=a[j]; 
	a[j]=a[j- 1 ]; 
	a[j- 1 ]=max;
	j=j- 1 ; [color=red]//Если a[0]<a[1], то на этой строке ты залезешь за пределы массива при втором проходе по циклу[/color]
  }
}
max=a[ 4 ];
for (i= 0 ;i< 5 ;i++) cout<<"a["<<i<<"]= "<<a[i]<<" "; cout<<"max="<<max<<endl;
это сортировка по убыванию
Отвыкли студенты писать хоть какие-нибудь тесты на бумаге...
В своё время приходилось писать без компилятора по несколько страниц кода, поскольку не было возможности работать с компом... Попробуйте - думать приучает...
А ещё рулит пошаговая отладка и здравый смысл...
...
Рейтинг: 0 / 0
почему работает не как надо?
    #33737621
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А как называется этот метод?
...
Рейтинг: 0 / 0
почему работает не как надо?
    #33737686
Dmitrii K.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AkhА как называется этот метод?
"Всё дело в пузырьках" :)
...
Рейтинг: 0 / 0
почему работает не как надо?
    #33737694
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dmitrii K. AkhА как называется этот метод?
"Всё дело в пузырьках" :)

Ни хрена не пузырек. Может какой-то модернизированнный?
...
Рейтинг: 0 / 0
почему работает не как надо?
    #33737705
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ой, блин, облажался. Это же опять во возрастанию. По убыванию так:

Код: plaintext
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.
	//Ïî óáûâàíèþ
int a[ 5 ], i, max;
for (i= 0 ;i< 5 ;i++)
{
   cout<<"a["<<i<<"]= ";
   cin>> a[i];
}

for (i= 0 ;i< 5 ;i++) cout<<"a["<<i<<"]= "<<a[i]<<" "; cout<<endl<<endl;
max=a[ 0 ];
for (i= 3 ; i>= 0 ;i--)
{
  int j=i;
  while (a[j]<a[j+ 1 ] && j< 4 ) 
  {
	max=a[j+ 1 ]; 
	a[j+ 1 ]=a[j]; 
	a[j]=max;
	j=j+ 1 ;
  }
}
max=a[ 4 ];
for (i= 0 ;i< 5 ;i++) cout<<"a["<<i<<"]= "<<a[i]<<" "; cout<<"max="<<max<<endl;
cin>>i;
}

Какой-то сокращенный пузырек
...
Рейтинг: 0 / 0
почему работает не как надо?
    #33737713
Dmitrii K.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Akh Dmitrii K. AkhА как называется этот метод?
"Всё дело в пузырьках" :)

Ни хрена не пузырек. Может какой-то модернизированнный?
Точнее, модифицированный...
Основной признак - перестановка соседних элементов по условию сортировки... А вариаций на тему "пузырьков" можно придумать сколько душе угодно... только вот смысл???
Есть же qsort, если лень самому писать нормальную сортировку...
...
Рейтинг: 0 / 0
почему работает не как надо?
    #33737722
никак этот метод не называется. я сам его придумал.
спасибо! так работает.
...
Рейтинг: 0 / 0
почему работает не как надо?
    #33737736
разве мой метод плох? :)
а вот кстати, почему нельзя написать используя вместо
Код: plaintext
for (i= 3 ; i>= 0 ;i--)
нормальный цикл типа:
Код: plaintext
for (i= 0 ; i< 5 ; i++)
...
Рейтинг: 0 / 0
почему работает не как надо?
    #33737755
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
случайныйХникак этот метод не называется. я сам его придумал.
спасибо! так работает.

Молодец. По моему он будет быстрее чем обычный пузырек. Но обрати внимание на свою строчку:

Код: plaintext
1.
while (a[j]>a[j- 1 ] || j== 0 )

Если у тебя j==0, то цикл пойдет дальше и a[j-1] выйдет за границы массива.

Кстати, для корректности, у меня тоже условие за выход границы лучше перенести сразу после while (сделать первым сравнением).
...
Рейтинг: 0 / 0
почему работает не как надо?
    #33737770
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
случайныйХразве мой метод плох? :)
а вот кстати, почему нельзя написать используя вместо
Код: plaintext
for (i= 3 ; i>= 0 ;i--)
нормальный цикл типа:
Код: plaintext
for (i= 0 ; i< 5 ; i++)


Ладно, открою тебе тайну. Я тебя обманул. Я сделал сортировку по возрастанию, но в обратном порядке. Можешь считать меня подлецом.

Раз ты сам придумал этот метод, попробуй разобраться как сделать по убыванию или докажи, что так сделать нельзя.
...
Рейтинг: 0 / 0
почему работает не как надо?
    #33737794
Dmitrii K.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
случайныйХразве мой метод плох? :)
а вот кстати, почему нельзя написать используя вместо
Код: plaintext
for (i= 3 ; i>= 0 ;i--)
нормальный цикл типа:
Код: plaintext
for (i= 0 ; i< 5 ; i++)


Вот тебе "нормальный" цикл:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
for (i= 0 ; i< 5 ;i++)
{
    for(j=i+ 1 ;j< 5 ;j++)
    {
        if(a[j]>a[i])
        {
        	tmp=a[i];
	a[i]=a[j];
	a[j]=tmp;
        }
    }
}
Классика :)
А лучше разберись с двоичной, Шелла или ещё какой-нибудь более "шустрой"... полезнее будет...
Тема вообще изъезженная, но всё-таки интересная.
...
Рейтинг: 0 / 0
почему работает не как надо?
    #33737849
о как! а мой метод то оказывается ещё и не для каждой последовательности цифр работает! 8-)
...
Рейтинг: 0 / 0
почему работает не как надо?
    #33737872
Dmitrii K.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
случайныйХо как! а мой метод то оказывается ещё и не для каждой последовательности цифр работает! 8-)
Ну зачем же изобретательством заниматься... А если уж так сильно хочется, то делай метод универсальным... проверяй на все возможные случаи.

"Если неприятность может случится, то случается самая неприятная неприятность в самый неподходящий момент" (с)
...
Рейтинг: 0 / 0
почему работает не как надо?
    #33737906
вот я и прогнал свой метод по полной. не выдержал он, сломался... :-/
а изобретаю просто от нечего делать. говорят изобретательства мозги развивают
...
Рейтинг: 0 / 0
почему работает не как надо?
    #33737918
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dmitrii K.
Ну зачем же изобретательством заниматься... А если уж так сильно хочется, то делай метод универсальным... проверяй на все возможные случаи.


Как зечем. Человеку стало интересно. Эксперементы очень полезны.
...
Рейтинг: 0 / 0
почему работает не как надо?
    #33737940
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кстати. У меня тут созрела мысль (исходя, из того, что СлучайныйХ написал, что метод работает не для всех последовательностей).

Мне кажется, что самая плохая последовательность для ВСЕХ типов сортировок, это последовательность отсортированнная наоборт.

Верно или нет?
...
Рейтинг: 0 / 0
почему работает не как надо?
    #33737944
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
случайныйХвот я и прогнал свой метод по полной. не выдержал он, сломался... :-/
а изобретаю просто от нечего делать. говорят изобретательства мозги развивают

Работает твой метод для последовательности, которая отсортирована наоборт?
...
Рейтинг: 0 / 0
почему работает не как надо?
    #33737967
ну не сильно я ошибся. просто надо было вместо
Код: plaintext
while (a[j]<a[j- 1 ] || j== 0 )
написать:
Код: plaintext
while (a[j]<a[j- 1 ] && j!= 0 )
. вот теперь все как надо!
...
Рейтинг: 0 / 0
почему работает не как надо?
    #33737979
AkhРаботает твой метод для последовательности, которая отсортирована наоборт?неа, не работал. а зато щас все грамотно. перетусовал последовательность всяко, метод испытания прошел!
...
Рейтинг: 0 / 0
почему работает не как надо?
    #33737991
Dmitrii K.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AkhКстати. У меня тут созрела мысль (исходя, из того, что СлучайныйХ написал, что метод работает не для всех последовательностей).

Мне кажется, что самая плохая последовательность для ВСЕХ типов сортировок, это последовательность отсортированнная наоборт.

Верно или нет?
Что ты понимаешь под словом "плохая" ?
В большинстве случаев она окажется самой трудоёмкой (максимальная длительность выполнения) ввиду того, что придётся производить максимальное количество перестановок...
Но это ощутимо только при использовании неэффективных алгоритмов, типа пузырей, вставок и т.п.
Скорость сортировки нормальными алгоритмами мало зависит от входных данных...
А вообще, эффективность алгоритмов - это целая математическая теория...
Достаточно посмотреть хотя бы трёхтомник Кнута, чтобы убедиться
)))
...
Рейтинг: 0 / 0
почему работает не как надо?
    #33738004
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
случайныйХну не сильно я ошибся. просто надо было вместо
Код: plaintext
while (a[j]<a[j- 1 ] || j== 0 )
написать:
Код: plaintext
while (a[j]<a[j- 1 ] && j!= 0 )
. вот теперь все как надо!

На выход за границы массива надо проверять в первую очередь, так как там может оказать недопустимая область памяти, а ты уже начинаешь сравнивать с элементом за границами массива. Поэтому проверку за выход границы лучше сделать так:

Код: plaintext
1.
2.
3.
4.
5.
6.
while (a[j]<a[j- 1 ]) {
   ...
   //j=j-1;
   if (j== 1 ) break;
   else j--;
}
...
Рейтинг: 0 / 0
почему работает не как надо?
    #33738014
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dmitrii K. AkhКстати. У меня тут созрела мысль (исходя, из того, что СлучайныйХ написал, что метод работает не для всех последовательностей).

Мне кажется, что самая плохая последовательность для ВСЕХ типов сортировок, это последовательность отсортированнная наоборт.

Верно или нет?
Что ты понимаешь под словом "плохая" ?
В большинстве случаев она окажется самой трудоёмкой (максимальная длительность выполнения) ввиду того, что придётся производить максимальное количество перестановок...
Но это ощутимо только при использовании неэффективных алгоритмов, типа пузырей, вставок и т.п.
Скорость сортировки нормальными алгоритмами мало зависит от входных данных...
А вообще, эффективность алгоритмов - это целая математическая теория...
Достаточно посмотреть хотя бы трёхтомник Кнута, чтобы убедиться
)))

Я не точно выразился. Я имею ввиду не трудоемкость, а проверка алгоритма на корректность. Т.е., если заработает с такой последовательностью, то заработает и с другими.
...
Рейтинг: 0 / 0
25 сообщений из 42, страница 1 из 2
Форумы / C++ [игнор отключен] [закрыт для гостей] / почему работает не как надо?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]