Автор Тема: Сортировка массива  (Прочитано 5300 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Paul56

  • Заглянувший
  • Новичок
  • *
  • Сообщений: 13
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
Сортировка массива
« : 28 Августа 2007, 20:33:47 »
о гуру перла, подскажите как мне решить следующую ситуацию:

есть:

$dannie=2 # Эта цифра может быть разной от 0 до 8 она передаётся через http

@massiv = ("A", "B", "C", "D", "E", "F");

Надо чтобы второй элемент массива стал первым, как правельно написать ?

Оффлайн NeoNox

  • Координатор
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 3012
  • +0/-0
  • 0
    • Просмотр профиля
Сортировка массива
« Ответ #1 : 29 Августа 2007, 01:06:21 »
Цитировать
Paul56:
как правельно написать

ПравЕльно написать "правИльно".
А скрипт может иметь такой вид

perl -de0

Loading DB routines from perl5db
.pl version 1.27
Editor support available
.

Enter h or `h h\' for help, or `man perldebug\' for more help.

main::(-e:1):   0
                                                                                  DB<1> @massiv = ("A", "B", "C", "D", "E", "F")

                                                                                  DB<2> $massiv_t = $massiv[0]

                                                                                  DB<3> $dannie=2

                                                                                  DB<4> $massiv[0] = $massiv[$dannie]

                                                                                  DB<5> $massiv[$dannie] = $massiv_t

                                                                                  DB<6> p @massiv
CBADEF

Это если через дополнительную переменную. Можно и идиомами, но выигрыша, скорее всего, не будет.
The documentations is your friend

Оффлайн vladsu

  • Фанат форума
  • Старожил
  • ****
  • Сообщений: 271
  • +0/-0
  • 0
    • Просмотр профиля
    • http://vladislavsurguchev.eu/
Сортировка массива
« Ответ #2 : 29 Августа 2007, 17:05:06 »
Я бы сделал так:

use strict;

my @massiv = ("A", "B", "C", "D", "E", "F");
my $dannie=2;

unshift @massiv,splice(@massiv,$dannie-1,1);

print "@massiv\\n";

Просто не люблю плодить переменные, хотя читабельности это не добавляет.
----------------------------------------------
Мой сайт чёрно-белых фотографий из разных уголков мира тут

Оффлайн NeoNox

  • Координатор
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 3012
  • +0/-0
  • 0
    • Просмотр профиля
Сортировка массива
« Ответ #3 : 29 Августа 2007, 17:37:41 »
perl -MBenchmark -de0

Loading DB routines from perl5db.pl version 1.28
Editor support available.

Enter h or `h h\' for help, or `man perldebug\' for more help.

main::(-e:1):   0
  DB<1> sub a1 () { my @massiv = ("A", "B", "C", "D", "E", "F"); my $massiv_t = $massiv[0]; my $dannie=2; $massiv[0] = $massiv[$dannie]; $massiv[$dannie] = $massiv_t; }

  DB<2> sub a2 () { my @massiv = ("A", "B", "C", "D", "E", "F"); my $dannie=2; unshift @massiv,splice(@massiv,$dannie-1,1); }

  DB<3> timethese (100000,{ "simple" => \\&a1, "unshift" => \\&a2 })
Benchmark: timing 100000 iterations of simple, unshift...
    simple:  0 wallclock secs (-0.01 usr +  0.00 sys = -0.01 CPU) @ -10000000.00/s (n=100000)
            (warning: too few iterations for a reliable count)
   unshift:  0 wallclock secs ( 0.04 usr +  0.00 sys =  0.04 CPU) @ 2500000.00/s (n=100000)
            (warning: too few iterations for a reliable count)

  DB<4> timethese (1000000,{ "simple" => \\&a1, "unshift" => \\&a2 })
Benchmark: timing 1000000 iterations of simple, unshift...
    simple:  1 wallclock secs (-0.10 usr +  0.00 sys = -0.10 CPU) @ -10000000.00/s (n=1000000)
            (warning: too few iterations for a reliable count)
   unshift:  1 wallclock secs ( 0.35 usr +  0.00 sys =  0.35 CPU) @ 2857142.86/s (n=1000000)
            (warning: too few iterations for a reliable count)
The documentations is your friend

Оффлайн vladsu

  • Фанат форума
  • Старожил
  • ****
  • Сообщений: 271
  • +0/-0
  • 0
    • Просмотр профиля
    • http://vladislavsurguchev.eu/
Сортировка массива
« Ответ #4 : 29 Августа 2007, 19:19:14 »
Алекс, а у меня другие рузультаты, только ты не заметил, что я добавил еще одну операцию вычитания, для удобства, если ее убрать то вот что получается:

use strict;
use Benchmark;

timethese(1_000_000, {
               \'simple\'  => sub { my @massiv = ("A", "B", "C", "D", "E", "F");my $massiv_t = $massiv[0]; my $dannie=2; $massiv[0] = $massiv[$dannie]; $massiv[$dannie] = $massiv_t; },
               \'unshift\' => sub { my @massiv = ("A", "B", "C", "D", "E", "F");my $dannie=2;unshift @massiv,splice(@massiv,$dannie,1); },
           });



...@...:~/tmp> ./2.pl
Benchmark: timing 1000000 iterations of simple, unshift...
    simple:  4 wallclock secs ( 3.52 usr +  0.00 sys =  3.52 CPU) @ 284090.91/s (n=1000000)
   unshift:  3 wallclock secs ( 3.55 usr +  0.00 sys =  3.55 CPU) @ 281690.14/s (n=1000000)
...@...:~/tmp> ./2.pl
Benchmark: timing 1000000 iterations of simple, unshift...
    simple:  3 wallclock secs ( 3.54 usr +  0.00 sys =  3.54 CPU) @ 282485.88/s (n=1000000)
   unshift:  3 wallclock secs ( 3.55 usr +  0.00 sys =  3.55 CPU) @ 281690.14/s (n=1000000)
...@...:~/tmp> ./2.pl
Benchmark: timing 1000000 iterations of simple, unshift...
    simple:  5 wallclock secs ( 3.60 usr +  0.00 sys =  3.60 CPU) @ 277777.78/s (n=1000000)
   unshift:  4 wallclock secs ( 3.59 usr +  0.00 sys =  3.59 CPU) @ 278551.53/s (n=1000000)
...@...:~/tmp> ./2.pl
Benchmark: timing 1000000 iterations of simple, unshift...
    simple:  4 wallclock secs ( 3.59 usr +  0.00 sys =  3.59 CPU) @ 278551.53/s (n=1000000)
   unshift:  3 wallclock secs ( 3.55 usr +  0.01 sys =  3.56 CPU) @ 280898.88/s (n=1000000)
...@...:~/tmp> ./2.pl
Benchmark: timing 1000000 iterations of simple, unshift...
    simple:  3 wallclock secs ( 3.52 usr +  0.00 sys =  3.52 CPU) @ 284090.91/s (n=1000000)
   unshift:  4 wallclock secs ( 3.55 usr +  0.00 sys =  3.55 CPU) @ 281690.14/s (n=1000000)
...@...:~/tmp> ./2.pl
Benchmark: timing 1000000 iterations of simple, unshift...
    simple:  3 wallclock secs ( 3.66 usr +  0.00 sys =  3.66 CPU) @ 273224.04/s (n=1000000)
   unshift:  3 wallclock secs ( 3.56 usr +  0.00 sys =  3.56 CPU) @ 280898.88/s (n=1000000)


Так что с точки зрения производительности все равно, сплайс то тоже работает через переменную.
----------------------------------------------
Мой сайт чёрно-белых фотографий из разных уголков мира тут

Оффлайн NeoNox

  • Координатор
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 3012
  • +0/-0
  • 0
    • Просмотр профиля
Сортировка массива
« Ответ #5 : 29 Августа 2007, 20:39:12 »
У тебя медленнее сервер ;)
Убедил.
The documentations is your friend

Оффлайн vladsu

  • Фанат форума
  • Старожил
  • ****
  • Сообщений: 271
  • +0/-0
  • 0
    • Просмотр профиля
    • http://vladislavsurguchev.eu/
Сортировка массива
« Ответ #6 : 30 Августа 2007, 01:49:24 »
Цитировать
NeoNox:
У тебя медленнее сервер

Это мой бук, на сервак не претендующий :-P
----------------------------------------------
Мой сайт чёрно-белых фотографий из разных уголков мира тут

 

Sitemap 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