Сортировка массива

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Demonx
Бывалый
Бывалый
 
Сообщения: 237
Зарегистрирован: 25.06.2003 (Ср) 0:08
Откуда: Литва/Висагинас

Сортировка массива

Сообщение Demonx » 17.12.2005 (Сб) 16:05

Есть динмаический массив Arr() as integer
....
redim preserve Arr(0 to 999) as integer.....
...
...
Так вот в элементах массива - цифры. Как отсортировать массив по возрастанию?
Изображение

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 17.12.2005 (Сб) 16:35

Сделать ещё один массив.
И заполнить его сначала единицами потом двойками, потом тройками:


Код: Выделить всё

Dim NmCounter(1 to MAX_NUM) as integer
Dim n as integer
For i = 1 To MAX_NUM
   For j = 1 to 999
     If Arr(j)=i then NmCounter(i)=NmCounter(i)+1
   next j
Next i
For i = 1 to MAX_NUM
   If NmCounter(i)>0 then
       For J = 1 To NmCounter(i)
           Array2(n) = i
            n=n+1       
       NextJ
   End If
next i


1) Код можно заметно сократить если использовать один цикл I

2) Код на работоспобность не проверялся, времени нет, но вроде бы должно работать.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Sasha_karasov
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 436
Зарегистрирован: 03.03.2005 (Чт) 19:38
Откуда: ua.dp

Сообщение Sasha_karasov » 18.12.2005 (Вс) 2:42

На algolist глянь, там очень много есть про сортировку :D
Удачи!
С уважением, Алексадр.

Sasha_karasov
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 436
Зарегистрирован: 03.03.2005 (Чт) 19:38
Откуда: ua.dp

Сообщение Sasha_karasov » 18.12.2005 (Вс) 3:56

http://algolist.manual.ru вот вспомнил!
Удачи!
С уважением, Алексадр.

GAGArin
Неистовый флудер
Неистовый флудер
 
Сообщения: 1777
Зарегистрирован: 23.12.2002 (Пн) 12:46
Откуда: я тут взялся, не знаю...

Сообщение GAGArin » 18.12.2005 (Вс) 9:05

Хакер
Код конечно прост в реализации, и линено возрастает, но нужен весьма и весьма длинный массив чтобы это окупилось. Для массива 999 элементов банальнейший пузырек и то будет ффективнее (в 32 с лишним раза) не говоря уже о квиксорте например.


Можно его чуток переделать, сохранив простоту, но добавив скорости.
Код: Выделить всё
For i = 1 To MAX_NUM
   For j = 1 to 999
     If Arr(j)=i then NmCounter(i)=NmCounter(i)+1
   next j
Next i

Заменим на:

Код: Выделить всё
For j = 1 to 999
  NmCounter(Arr(j))=NmCounter(Arr(j))+1
next j

Не изменяя вторую часть кода уже повышаем эффективность первой в 32 тысячи раз Причем для Integer'ов вроде должно работать.
Ну один завершающий проход по всему интеджеру придеться оставить. Но это уже судьба 8) Кстати коды (и хакера и переделаный мной) стоит чуток поправить на предмет существования отрицательных чисел, но тут уж просто добавить/вычесть 32768

Вобщем код хороший, для данного конкретного примера, но реализация шокирует. :shock: Эффективность снижена почти в Тысячу раз. (считал для 65536 проходов, а не 32768)

65536*1000/(65536+999)=985 Ну еще немножко с этой цифры скосит наличее второго цикла в финальном проходе, но все равно эффективность не в лучшей форме.

Ну и есть еще одна проблемка, памяти код жрет тоже в 50 с лишним раз больше чем мог бы это сделать алгоритм работающий с одним массивом (но тут реализовать подобный код не удасться, а он все же в переделаном варианте весьма быстр) Вобщем на усмотрение автора топика. Чем длиннее сортируемый массив, тем лучше код предложеный Хакером. Для коротких массивов он жрет непозволительно много памяти.

PS Все писал тоже без VB не проверял.


Вернуться в Visual Basic 1–6

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

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

    TopList