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

20.10. Как отсортировать данные?

В: Как отсортировать данные? Например, список персонажей по алфавиту, или набор чисел от меньшего к большему.

О: Прежде всего такие данные должны лежать в одном массиве. Например:

$personage[0]='Петя'
$personage[1]='Ваня'
$personage[2]='Сева'
$personage[3]='Саша'
$personage[4]='Лёня'

Или:

number[0]=345
number[1]=798
number[2]=930
number[3]=121
number[4]=474

Если вам достаточно просто отсортировать данные в массиве, воспользуйтесь оператором SORTARR. Он легко и просто отсортирует данные в вашем массиве по возрастанию или убыванию в зависимости от того, что вам необходимо:

sortarr '$personage' & ! сортируем персонажей от меньшего к большему
sortarr 'number', 1 & ! сортируем числа от большего к меньшему

Если же вам нужно не только отсортировать данные в одном массиве, но и переставлять данные в другом массиве во время сортировки первого, используйте собственный алгоритм сортировки:

! объявляем локальные переменные
local $varMax, index
! временные массивы для промежуточного хранения данных
local $personage_temp, number_temp
! копируем данные во временные массивы,
! чтоб не затереть исходные
copyarr '$personage_temp','$personage'
copyarr 'number_temp','number'
! с помощью цикла выбираем элементы по одному
! из временного массива, соответсвующего сортируемому
loop while arrsize('$personage_temp')>0:
! цикл будет работать, пока размер временного массива больше нуля
! получаем минимальное значение
$varMax=$min('$personage_temp')
! определяем, в каком элементе лежит это значение
index = arrpos('$personage_temp',$varMax)
! выводим значения на экран
*pl '<<$personage_temp[index]>>: <<number_temp[index]>>'
! или запоминаем в других массивах
$personage_sort[] = $personage_temp[index]
number_sort[] = number_temp[index]
! удаляем элементы из временных массивов
killvar '$personage_temp',index
killvar 'number_temp',index
end

Обратите внимание, при работе с текстовыми значениями меньшим считается то, которое идёт раньше согласно алфавитного порядка.

Этот алгоритм достаточно быстр и прост для решения большинства задач. Он требует нескольких переменных и дополнительный массив для временного хранения данных. Если необходимо отсортировать данные сразу внутри массива, не прибегая к помощи дополнительного массива, можно воспользоваться методом сортировки "пузырьком":

проходы=0
loop local проходы=0 while проходы<arrsize("сортируемый_массив") step проходы+=1:
loop local всплытия=проходы while всплытия<arrsize("сортируемый_массив") step всплытия+=1:
if сортируемый_массив[проходы] < сортируемый_массив[всплытия]:
! или, если нужен другой порядок:
!if сортируемый_массив[проходы] > сортируемый_массив[всплытия]:
запоминальная_переменная = сортируемый_массив[проходы]
сортируемый_массив[проходы] = сортируемый_массив[всплытия]
сортируемый_массив[всплытия] = запоминальная_переменная
end
end
end

Операции сравнения прекрасно работают с текстовыми значениями и кортежами по тому же принципу, что и функции $max и $min.

Работающий пример: Сортировка данных.