Вопрос по скороти сортировки:

Разговоры на любые темы: вы можете обсудить здесь какой-либо сайт, найти единомышленников или просто пообщаться...
Vitaly1
Брехман
Брехман
 
Сообщения: 1578
Зарегистрирован: 30.12.2002 (Пн) 16:35
Откуда: Russia, Mosсow

Вопрос по скороти сортировки:

Сообщение Vitaly1 » 18.02.2004 (Ср) 20:18

Какой метод сортировки быстрее:
1)

for i=1 to n-1
for j=i+1 to n
if a(i)<a(j) then
s=a(i)
a(i)=a(j)
a(j)=s
end if
next j
next i


2)

for i=1 to n-1
max= a(i)
k=i
for j=i+1 to n
if max<a(j) then
max= a(j)
k = j
end if
next j
a(k)=a(i)
a(i) = max
next i


Я знаю кокой быстрей, и почему! А вы знаете?...

Amed
Алфизик
Алфизик
 
Сообщения: 5346
Зарегистрирован: 09.03.2003 (Вс) 9:26

Сообщение Amed » 18.02.2004 (Ср) 20:30

Ну, ясно что второй метод быстрее, скорее всего, из-за того, что i-тый элемент массива сохраняется в отдельную переменную...
А вообще - это стандартный "пузырёк" :)

Vitaly1
Брехман
Брехман
 
Сообщения: 1578
Зарегистрирован: 30.12.2002 (Пн) 16:35
Откуда: Russia, Mosсow

Сообщение Vitaly1 » 19.02.2004 (Чт) 17:24

Удивительно что на этот вопрос ответил только один человек. Второй вариант действительно быстрее, проверено опытом. Я скажу как я предполагаю почему, а другие, пусть выскажут свое мнение.

В первом варианте, при одном обмене между ячейками массива на каждом шаге используется три оператора присвоения. Во втором варианте на каждом цикле J используется только два оператора присвоения, но есть еще два оператора до цила J и после. Таким образом, при двух обменах в обоих алгоритмах выполнятся шесть операторов присваивания, но начиная с третьего объмена, во втором алгоритме будет выполненно на каждом новом цикле на один обмен меньше, что и приведет к более быстрой сортировки достаточно неупорядочных данных. Я прав, или нет???

Krasavica
Небожительница
Небожительница
Аватара пользователя
 
Сообщения: 1378
Зарегистрирован: 04.11.2003 (Вт) 17:51
Откуда: Россия, город-герой Москва ;-)

Сообщение Krasavica » 20.02.2004 (Пт) 0:16


Vitaly1
Немного подкорректировала и написала на Delphi эти алгоритмы
практически одинаковы. Первый обогнал на 3ms при
сортировке 1 млн элементов. Тестировала на Athlon 1600XP+. :wink:

Amed
Простите, а можно у вас спросить, что такое "пузырёк"? :roll:
я - ангел!!! ...просто крылья в стирке, а нимб на подзарядке!
Меня трудно найти, легко потерять и невозможно забыть.Изображение

Vitaly1
Брехман
Брехман
 
Сообщения: 1578
Зарегистрирован: 30.12.2002 (Пн) 16:35
Откуда: Russia, Mosсow

Сообщение Vitaly1 » 20.02.2004 (Пт) 9:23

Метод "пузырька" это дурацкое название одного из наиболее долгого метода сортировки, который выше не указан, вот он:

for i=1 to n-1
for j=1 to n-1
if a(j)<a(j+1) then
s=a(j)
a(j)=a(j+1)
a(j+1)=s
end if
next j
next i

"Пузырек" потому, что самый "легкий" элемент массива "всплывает" (перемещается в старшую по индексу ячейку массива)


Что значит немного подкорректировала алгоритмы? Там нечего корректировать! Второй алгоритм работает ощутимо быстрее первого, если данные достаточно перепутанны!

X-BOND
Реалист
Реалист
 
Сообщения: 944
Зарегистрирован: 19.08.2002 (Пн) 11:44
Откуда: Ukraine

Сообщение X-BOND » 20.02.2004 (Пт) 17:09

Каждый метод сортировки имеет свои достоинства.
"Пузырек" самый медленный и самый простой
А вообще один метод быстро отсортирует небольшой массив, а при очень большом количестве элементов быстрее справится другой.
Всегда нужен компромис

Oxygen
Белая и пушистая
Белая и пушистая
Аватара пользователя
 
Сообщения: 1314
Зарегистрирован: 15.07.2003 (Вт) 7:14
Откуда: Москва

Сообщение Oxygen » 20.02.2004 (Пт) 18:31

Насколько мне известно, самый быстый метод - это метод быстрой сортировки, у меня где-то была реализация, только на С++. Переводить очень уж лень. Если нужно очень, я могу кинуть, если у кого есть на VB киньте пожалуйста. А эти методы ИМХО для больших объемов информации очень уж медленные.

Vitaly1
Брехман
Брехман
 
Сообщения: 1578
Зарегистрирован: 30.12.2002 (Пн) 16:35
Откуда: Russia, Mosсow

Сообщение Vitaly1 » 21.02.2004 (Сб) 10:03

Конечно кинь, посмотрим, что за метод.

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 21.02.2004 (Сб) 10:07

Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Oxygen
Белая и пушистая
Белая и пушистая
Аватара пользователя
 
Сообщения: 1314
Зарегистрирован: 15.07.2003 (Вт) 7:14
Откуда: Москва

Сообщение Oxygen » 21.02.2004 (Сб) 21:41

Вот еще парочка алгоритмов сортировки.

Krasavica
Небожительница
Небожительница
Аватара пользователя
 
Сообщения: 1378
Зарегистрирован: 04.11.2003 (Вт) 17:51
Откуда: Россия, город-герой Москва ;-)

Сообщение Krasavica » 23.02.2004 (Пн) 11:03

В этом разделе будет рассмотрен знаменитый алгоритм «быстрой» сортировки, по праву считающийся самым быстрым среди неспециализированных алгоритмов сортировки. Для сравнения мы также рассмотрим один из алгоритмов сортировки, имеющих более низкую эффективность, но и более простых алгоритмов – сортировку вставками.

:wink:

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

Sirik
Perspicaz
Perspicaz
Аватара пользователя
 
Сообщения: 2280
Зарегистрирован: 19.02.2004 (Чт) 16:09
Откуда: Бердичев, Украина

Сообщение Sirik » 23.02.2004 (Пн) 14:17

А почему бы не воспользоваться таким методом:

Код: Выделить всё
for i=1 to n-1
for j=i+1 to n
if a(i)<a(j) then
  s=a(i): a(i)=a(j):a(j)=s
end if
next
next

Быстрей чем стандартный "пузырёк", я всегда его юзаю.

gaidar
System Debugger
System Debugger
 
Сообщения: 3152
Зарегистрирован: 23.12.2001 (Вс) 13:22

Сообщение gaidar » 23.02.2004 (Пн) 14:26

Товарищи, посмотрите на algolist.manual.ru там есть алгоритмы всех популярных сортировок. На Pascal, конечно.
The difficult I’ll do right now. The impossible will take a little while. (c) US engineers in WWII
I don't always know what I'm talking about, but I know I'm right. (c) Muhammad Ali

Amed
Алфизик
Алфизик
 
Сообщения: 5346
Зарегистрирован: 09.03.2003 (Вс) 9:26

Сообщение Amed » 23.02.2004 (Пн) 20:02

Знающий писал(а):А почему бы не воспользоваться таким методом:

Код: Выделить всё
for i=1 to n-1
for j=i+1 to n
if a(i)<a(j) then
  s=a(i): a(i)=a(j):a(j)=s
end if
next
next

Быстрей чем стандартный "пузырёк", я всегда его юзаю.


/me катается по полу :lol:.
Это и есть "пузырёк" :)

Sirik
Perspicaz
Perspicaz
Аватара пользователя
 
Сообщения: 2280
Зарегистрирован: 19.02.2004 (Чт) 16:09
Откуда: Бердичев, Украина

Сообщение Sirik » 24.02.2004 (Вт) 10:18

/me катается по полу .
Это и есть "пузырёк"


Так то воно, але трішечки не так.

Эта разновидность "пузырька"!!! И она быстрее СТАНДАРТНОГО "пузырька". Я же не отрицал, что это вобще не "пузырёк"?!?
Просто читать надо внимательно.
Состояний же любви — десять: любовный взгляд, привязанность в мыслях, рождение желания, бессонница, исхудание, отвращение к предметам восприятия, утрата стыда, безумие, потеря сознания и смерть — вот их признаки

Vitaly1
Брехман
Брехман
 
Сообщения: 1578
Зарегистрирован: 30.12.2002 (Пн) 16:35
Откуда: Russia, Mosсow

Сообщение Vitaly1 » 26.02.2004 (Чт) 12:21

Ну если уж вам пузырек злочастный нравится, пожалуйс то, некоторое усовершенствования пузырька:


Код: Выделить всё
do
flag = true
for j=1 to n-1
if a(j)<a(j+1) then
flag=false
s=a(j)
a(j)=a(j+1)
a(j+1)=s
end if
next j
loop until flag = true

Ilya Vasilyev
Постоялец
Постоялец
 
Сообщения: 820
Зарегистрирован: 06.08.2002 (Вт) 5:36
Откуда: Russia, Omsk

Сообщение Ilya Vasilyev » 26.02.2004 (Чт) 12:47

Vitaly1 писал(а):Ну если уж вам пузырек злочастный нравится, пожалуйс то, некоторое усовершенствования пузырька:


Что-т я не понял :shock:
1. Как ты собираешься за один проход список сортировать :?:
2. При первом удовлетворении условия цикл останавливается :!:
Изображение
Компьютер позволяет решать все те проблемы, которые до его изобретения не существовали

Vitaly1
Брехман
Брехман
 
Сообщения: 1578
Зарегистрирован: 30.12.2002 (Пн) 16:35
Откуда: Russia, Mosсow

Сообщение Vitaly1 » 27.02.2004 (Пт) 11:33

Илья Васильев писал(а):Что-т я не понял
1. Как ты собираешься за один проход список сортировать
2. При первом удовлетворении условия цикл останавливается


Где он остановится! Если хотя бы нашлось одно соответствие а(j) <a(j+1) цикл еще раз повториться, а если на всех а(j) >=a(j+1), то массив уже отсортирован по убыванию!

Vitaly1
Брехман
Брехман
 
Сообщения: 1578
Зарегистрирован: 30.12.2002 (Пн) 16:35
Откуда: Russia, Mosсow

Сообщение Vitaly1 » 27.02.2004 (Пт) 13:16

А я еще придумал, ускорение, для другого метода:

Код: Выделить всё
i=0
do
i=i+1
flag= true
for j=i+1 to n
if a(i)<a(j) then
flag=false
s=a(i)
a(i)=a(j)
a(j)=s
end if
next j
loop until flag=true


можно конечно и так:

Код: Выделить всё
for i=1 to n-1
flag= true
for j=i+1 to n
if a(i)<a(j) then
flag=false
s=a(i)
a(i)=a(j)
a(j)=s
end if
next j
if flag=true then
exit for
end if
next i


но я думаю, что в первом случаи будет быстрее, т.к. компьютер не будет проверять условие i<=n-1

A.A.Z.
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3035
Зарегистрирован: 30.06.2003 (Пн) 13:38

Сообщение A.A.Z. » 27.02.2004 (Пт) 18:33

Народ! Лучше заменить

For i = 1 To j
Next

на

i = 1
Do Until i = j
Loop

Do - Loop быстрее, чем For - Next
Нет меня больше

Unstat
Реальный басяк
Реальный басяк
Аватара пользователя
 
Сообщения: 285
Зарегистрирован: 07.01.2004 (Ср) 22:19
Откуда: Нижний Новгород

Сообщение Unstat » 21.03.2004 (Вс) 17:48

Они одинаковы проверено при 20 элементах массива 190 операций выполняется что у первого что у второго. Вот так вот
___________________________________
http://unstat.narod.ru


Вернуться в Народный треп

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 66

    TopList