2015-11-09 4 views
-2

Я пишу программу на Perl. Для его части требуется сортировка чисел. Но это не обычная сортировка. Значения примерно такие. 01,02,03,04,05,97,98,99. Я хочу, чтобы он был отсортирован таким образом.Сортировка в perl определенным образом

97 
98 
99 
01 
02 
03 
04 
05 

Мы сортируем пакеты данных. Если вчера последний пакет данных составлял 96, то сегодня он начнется с 97 и продолжится до 99, а затем вернется к 01 02 .... и остановится на некотором количестве, скажем 06.

+0

Откуда вы знаете, что начинаете с 97? Все ли номера последовательны? – Sobrique

+0

Нет, он не может начинаться ни с одним случайным, ни между 1-99 .. приведенным выше, это просто пример .. значения достигнут 99, и он начнется с 01 снова, и он будет загружен при некотором случайном значении. – nithin

+0

@nithin Он начинается с '1' или' 01'? – TLP

ответ

2

Скажите последнее число со вчерашнего дня составляет 93 (случай 1). Вы хотите

94: position 0 
95: position 1 
.. 
93: position 99 

Операция модуля может использоваться для создания этого отображения.

($_ - $last_from_yesterday - 1) % 100 

Сортировка становится тривиальным:

sort { ($a - $last_from_yesterday - 1) % 100 <=> ($b - $last_from_yesterday - 1) % 100 } 
+0

Обновленный ответ в ответ на последнее обновление к вопросу. – ikegami

0

Я предполагаю, основываясь на данных, что ваши номера являются последовательными, но обтекание 100. Таким образом, вы нашли бы «старт», заказав все, затем ищет разрыв. (Это прерывается, если у вас есть полный цикл!)

#!/usr/bin/env perl 
use strict; 
use warnings; 

my @numbers = (1,2,3,4,5,97,98,99); 

#sort them 
my @sorted = sort { $a <=> $b } @numbers; 

#rotate the numbers until your 'gap' is off the end of the cycle. 

my $splice = 0; 
for (my $index = 0; $index < $#numbers; $index++) { 
    print 1+$sorted[$index] % 100,","; 
    print $sorted[$index+1] % 100,"\n"; 
    if (($sorted[$index] + 1) %100 < $sorted[$index+1] % 100) { 
     $splice = $index; 
    } 
} 
print "Splicing on $splice\n"; 
@numbers = (splice (@sorted, $splice+1, @sorted - $splice), splice (@sorted, 0, $splice+1)); 
print join ",", @numbers; 

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

+0

Я проверил на этот случай: 01,02,04,06,07,91,95,99 он дал мне ниже ответ Склеивание по 6 99,1,2,4,6,7,91,95 – nithin

+0

Это работает, но он не работает исчерпывающе - с номерами в последовательности легко обнаружить разрыв. С цифрами, которые нет, трудно сказать, где должен быть перерыв. – Sobrique

+0

@Sobrique Вы, вероятно, не должны сортировать числа в алфавитном порядке, даже если это произойдет, чтобы работать с этими данными. – TLP