Перейти к содержимому

Фотография

Perl sort


  • Авторизуйтесь для ответа в теме
Сообщений в теме: 8

#1
image

image
  • Случайный прохожий
  • 2 сообщений
Нужно сортировать массив  в порядку убывания
При этом числа равные X считались меньше остальных даже если в  массиве есть числа<X
Исходный массив
qw(1 2 5 9 20 20 1 3 6 2);
При X==20 нужно получит такой результат
20 20 1 1 2 2 3 5 6 9
Ищется решение на Perl
PS на самом деле массивы имеют примерно такой вид
for(my $i=1; $i<1000; $i++) {
push @array, (1..25);
}
  • 0

#2
uuu

uuu
  • Свой человек
  • 503 сообщений
Ну если тупо то так:
#!perl 
my( $i_b,$i );
my @array;
for(my $i=1; $i<10000; $i++) {
	push @array, (1..25);
}

@array = sort { $a <=> $b } @array;

foreach( @array ) {
	if( $_ == 20 ) {
		$i++;
		next;
	}
	last if( $i );
	$i_b++;
}
if( $i ) {
	@array = ( ( splice @array ,$i_b,$i,() ),@array );
}


print "@array";


З.Ы.
Есть более специальные форумы на которых ЕСТЬ умные люди, готовые помочь, здесь(на этом форуме) нет ИМХО. Народ в Казахстане такой что ли?
  • 0

#3
ALX

ALX

    Читатель

  • Забанен
  • 1 291 сообщений
твое  имхо  ошиблось  в  этот  раз,  я  был  готов  помочь :smoke:

#4
uuu

uuu
  • Свой человек
  • 503 сообщений

твое  имхо  ошиблось  в  этот  раз,  я  был  готов  помочь :smoke:


There's More Than One Way To Do It

я Уверен, что  предложил самое банальное решения!
я Уверен, что есть решение лучше!
ALX покажите своё решение.
  • 0

#5
ALX

ALX

    Читатель

  • Забанен
  • 1 291 сообщений
у  меня  то  вариантов  много..и  у  вас не  самое  банальное...  вот  например...

1)заменить  число x в  массиве  на  заведомо  меньшее1(если  такое  существует),  отсортировать sort и  сделать   обратную  замену :smoke:
2) воспользоватся  чуть  модифицированным  методом  qsort  или  пузырька...

#6
Tzar

Tzar
  • Завсегдатай
  • 242 сообщений
на С можно так:
int first = 20; 
int compare ( const void *a, const void *b ) { 
   const int *pa = a; 
  const int *pb = b; 
   if ( *pa == first ) return -1; 
   if ( *pb == first ) return +1; 
    if ( *pa < *pb ) return -1; 
   if ( *pa > *pb ) return +1; 
   return 0; 
} 

  • 0

#7
image

image
  • Случайный прохожий
  • 2 сообщений
Tzar на Perl это так:

@array=sort{if($b==20){1}elsif($a==20){-1}else{$a<=>$b}}@array;

Думаю можно найти способ быстрее Добровольцы поискать есть?:D
  • 0

#8
Tzar

Tzar
  • Завсегдатай
  • 242 сообщений

Tzar на Perl это так:
@array=sort{if($b==20){1}elsif($a==20){-1}else{$a<=>$b}}@array;
Думаю можно найти способ быстрее Добровольцы поискать есть?:D

да конечно же есть.
я вот поискал и нашел быстрый способ - временная сложность почти линейная (я думаю реализовать это на перле несложно)
и тебе советую воспользоваться поиском - тема сортировки и поиска довольно обширная
  • 0

#9
uuu

uuu
  • Свой человек
  • 503 сообщений
Вы не поверите но на тестовом массиве так быстрее

for ( my $i=1; $i<10; $i++ )
{
push @array, ( 1..25 );
}
push @array, grep{($_==20)?((unshift @array, $_),0):1} sort{$a<=>$b}(splice @array,0,scalar @array);

print "@array";


Дело было вечером делать было нечего
  • 0


Количество пользователей, читающих эту тему: 1

пользователей: 0, неизвестных прохожих: 1, скрытых пользователей: 0

Размещение рекламы на сайте     Предложения о сотрудничестве     Служба поддержки пользователей

© 2011-2022 vse.kz. При любом использовании материалов Форума ссылка на vse.kz обязательна.