Как упорядочить массив данных. Как делается сортировка массивов? Упорядочить массив чисел по возрастанию

Предположим, у меня есть массив, который имитирует таблицу базы данных. Каждый элемент массива представляет строку, и внутри каждой строки находится другой массив, содержащий имена и значения полей.

Array ( => Array ( => "Sony TV" => 600.00) => Array ( => "LG TV" => 350.00) => Array ( => "Samsung TV" => 425.00) }

То, что я хочу сделать, это отсортировать строки (элементы внешнего массива) по цене. Ниже приведен пример того, чего я хочу достичь:

Array ( => Array ( => "LG TV" => 350.00) => Array ( => "Samsung TV" => 425.00) => Array ( => "Sony TV" => 600.00) }

Как вы можете видеть, мне не нужно сохранять ключи внешнего массива.

Вам нужно использовать usort – функцию, которая сортирует массивы через определенную пользователем функцию. Что-то вроде:

Function cmp($a, $b) { if ($a["price"] == $b["price"]) { return 0; } return ($a["price"] < $b["price"]) ? -1: 1; } usort($yourArray,"cmp")

Вы можете использовать usort() :

Function sort($a, $b) { if ($a["price"] == $b["price"]) return 0; return ($a["price"] > $b["price"]) ? 1: -1; } usort($array, "sort");

Еще лучше, если вы создадите такой класс, чтобы повторно использовать код:

Class FieldSorter { public $field; function __construct($field) { $this->field = $field; } function cmp($a, $b) { if ($a[$this->field] == $b[$this->field]) return 0; return ($a[$this->field] > $b[$this->field]) ? 1: -1; } } $sorter = new FieldSorter("price"); usort($array, array($sorter, "cmp"));

Таким образом, вы можете легко отсортировать по другим полям.

И хотя вы сказали, что ключи внешнего массива не нужно сохранять, вы можете легко достичь этого, используя uasort() вместо usort .

Этот вопрос немного стар, но оставит здесь ответ на будущее.

Из функции php.net-Multisort мы можем использовать приведенный ниже код;

$data= [["volume" => 67, "edition" => 2],["volume" => 85, "edition" => 6],...]; foreach ($data as $key => $row) { $volume[$key] = $row["volume"]; $edition[$key] = $row["edition"]; } array_multisort($volume, SORT_DESC, $edition, SORT_ASC, $data);

Вышеупомянутая информация предназначена для статической сортировки данных, где вы вручную меняете столбцы сортировки.

Для более динамичного и надежного примера рассмотрим ниже;

Предположим, у меня есть данные ниже;

$data = [, , , , , , ,....]

Если нам нужно отсортировать данные массива выше, мы можем установить порядок сортировки в массиве с использованием синтаксиса;

$qTable[$index]=$sort_order; Eg $qTable=;

Это означает столбец сортировки 1 ASC, столбец 4 DESC, а затем столбец 3 ASC. Затем мы можем использовать приведенную ниже функцию для сортировки данных мультимодальной базы данных;

Function sortMulti($data, $orders) { $args = ; foreach ($data as $key => $row) { foreach ($orders as $index => $order) { if (!isset($row[$index])) continue; //Ignore if column does"nt exist $args[$index]["d"][$key] = $row[$index]; //Get all values within the column $args[$index]["o"] = "desc" == strtolower($order) ? SORT_DESC: SORT_ASC; //Get the Sort order "ASC" is the default } } $p = ; //Below we need to organize our entries as arguments for array_multisort foreach ($args as $arg) { $p = $arg["d"]; $p = $arg["o"]; //Below we need to check if column contains only numeric or not. //If all values are numeric, then we use numeric sort flag, otherwise NATURAL //Manipulate for more conditions supported $p = count($arg["d"]) == count(array_filter($arg["d"], "is_numeric")) ? SORT_NUMERIC: SORT_NATURAL; } $p = &$data; //Pass by reference call_user_func_array("array_multisort", $p); //Call Php"s own multisort with parameters in required order. return $data; //Our final array sorted. }

Тогда мы можем использовать его, как показано ниже;

$data=[[...],[...],...]; $order=; $sorted=sortMulti($data,$order); по $data=[[...],[...],...]; $order=; $sorted=sortMulti($data,$order); по $data=[[...],[...],...]; $order=; $sorted=sortMulti($data,$order); по $data=[[...],[...],...]; $order=; $sorted=sortMulti($data,$order);

Для данных массива ключевых значений. Eg $data=[["c1"=>1212,"c2"=>"mynames"],...]; Используйте порядок как $order=["c1"=>"desc","c10"=>"asc"];

Я протестировал выше с массивом из 1000 записей. Надеюсь, это поможет кому-то.

Альтернативой usort является создание массива, который индексирует массив, который вы хотите отсортировать, и индексируется данными, которые вы хотите отсортировать.

В нижеприведенном фрагменте $ customAttributes представляет собой массив объектов, которые я хотел бы сортировать по имени . Создается первый сортировка $ , индексируется по имени и содержит индекс массива соответствующего элемента $ customAttributes .

$sort = ; foreach($customAttributes as $c => $ca) { $sort[$ca->name] = $c; }

Затем ksort используется для сортировки массива по ключу.

Ksort($sort);

После сортировки массива $ sort , итерации через него и создания $ упорядоченного массива.

Известны результаты соревнования 9 участников по стрельбе. Расположить данные результаты в порядке возрастания набранных при стрельбе очков.

Алгоритм решения данной задачи является наиболее сложным из приведенных выше примеров и требует использования вложенных циклов.

Один из способов сортировки массивов заключается в следующем. Сначала первый элемент массива в цикле сравнивается по очереди со всеми оставшимися элементами. Если очередной элемент массива меньше по величине, чем первый, то эти элементы переставляются местами. Сравнение продолжается далее уже для обновленного первого элемента. В результате окончания данного цикла будет найден и установлен на первое место самый наименьший элемент массива. Далее продолжается аналогичный процесс уже для оставшихся элементов массива, т.е. второй элемент сравнивается со всеми остальными и, при необходимости, переставляется с ними местами. После определения и установки второго элемента массива, данный процесс продолжается для третьего элемента, четвертого элемента и т.д. Алгоритм завершается, когда сравниваются и упорядочиваются предпоследний и последний из оставшихся элементов массива.

Программа реализации изложенного алгоритма может иметь следующий вид:

Program pr4;

Type STREL=arrayof integer;

Var rez:strel;

i,j,s:integer;

For i:=1 to 9 do

writeln(‘Введите результаты ",i,"-го участника");

readln(rez[i]);

for i:=1 to 8 do

for j:=i+1 to 9 do

if rez[i]>rez[j] then

s:=rez[j];

rez[j]:=rez[i];

rez[i]:=s;

writeln(‘Отсортированные по возрастанию результаты:");

for i:=1 to 9 do write (rez[i]:5," ‘);

Здесь STREL - тип массива результатов стрельбы участников, rez[i] - переменная для описания результатов i-го участника (i меняется от 1 до 9). Вспомогательная переменная s используется при перестановке местами элементов массива.

Алгоритм сортировки выбором в Turbo Pascal
Очевидно, что первое место в массиве должен занять минимальный элемент массива, второе - наименьший из всех остальных, третий - наименьший из оставшихся и т.д.
Для этого необходимо выполнить следующую последовательность действий:
1. Определить минимальный элемент массива;
2. Поменять его местами с первым элементом;
3. Определить минимальный элемент среди оставшихся;
4. Поменять его местами со вторым элементом и т.д.;
Эта последовательность действий должна выполняться до тех пор, пока не будет определён последний минимальный элемент.
Данный способ называется сортировка выбором.
Всю операцию по упорядочиванию массива можно разбить на более простые задачи и назвать сортировкой выбора.
Первая - поиск минимального элемента. Предлагаемый фрагмент программы напомнит Вам, как это делается.

min:=m; {допустим, что 1-й элемент - минимален}
t:=1; {и его номер = 1}
FOR i:=1 TO 30 DO
if m[i]> buf:=m[t]; {замена}
m[t]:=m[i];
m[i]:=buf;
END;

Описанный метод «сортировки выбором» сортировки массивов можно применять как для сортировки массивов по возрастанию, так и для сортировки массивов по убыванию. Для этого просто необходимо определять не минимальный элемент массива, а максимальный. В тексте программы это выражается заменой в некоторых местах знака "".


41. Множества в Паскале

Множество - это структурированный тип данных, представляющий собой набор взаимосвязанных по какому-либо признаку или группе признаков объектов, которые можно рассматривать как единое целое. Каждый объект в множестве называется элементом множества.

Все элементы множества должны принадлежать одному из порядковых типов, содержащему не более 256 значений. Этот тип называется базовым типом множества. Базовый тип задается диапазоном или перечислением.

Область значений типа множество - набор всевозможных подмножеств, составленных из элементов базового типа. В выражениях на языке Паскаль значения элементов множества указываются в квадратных скобках: , ["а",‘b","с"], ["a".."z"].

Если множество не имеет элементов, оно называется пустым и обозначается как . Количество элементов множества называется его мощностью.

Множество может принимать все значения базового типа. Базовый тип не должен превышать 256 возможных значений. Поэтому базовым типом множества могут быть byte, char, boolean и производные от них типы.

Множество в памяти хранится как массив битов, в котором каждый бит указывает является ли элемент принадлежащим объявленному множеству или нет. Максимальное число элементов множества 256, а данные типа множество могут занимать не более 32 байт.

Число байтов, выделяемых для данных типа множество, вычисляется по формуле:

ByteSize = (max div 8) - (min div 8) + 1,

где max и min - верхняя и нижняя границы базового типа данного множества.

Номер байта для конкретного элемента Е вычисляется по формуле:

ByteNumber = (E div 8) - (min div 8),

номер бита внутри этого байта по формуле:

BitNumber = E mod 8

Не имеет значения порядок записи элементов множества внутри конструктора. Например, и - это эквивалентные множества.

Каждый элемент в множестве учитывается только один раз. Поэтому множество эквивалентно .

Переменные множественного типа описываются так:
Var <идентификатор> : set of <базовый тип>;

Например:

Var A, D: Set Of Byte; B: Set Of "a".."z"; C: Set Of Boolean;

Нельзя вводить значения во множественную переменную процедурой ввода и выводить процедурой вывода.

Множественная переменная может получить конкретное значение только в результате выполнения оператора присваивания:
<множественная переменная> := <множественное выражение>;

Например:

A: = ;B: = ["m", "n", "k"]; C: = ; D: = A;

Кроме того, выражения могут включать в себя операции над множествами.

Операции над множествами

Объединением двух множеств A и B называется множество, состоящее из элементов, входящих хотя бы в одно из множеств A или B. Знак операции объединения в Паскале «+».

1) + => 2) +[‘a’..’z’]+[‘A’..’E’, ‘k’] => [‘A’..’E’, ‘a’..’z’]3) + =>

Пересечением двух множеств A и B называется множество, состоящее из элементов, одновременно входящих во множество A и во множество B.

Знак операции пересечения в Паскале «*»

1) * => 2) [‘a’..’z’]*[‘A’..’E’, ‘k’] => [‘k’]3) * =>

Разностью двух множеств A и B называется множество, состоящее из элементов множества A, не входящих во множество B.

1a) - => 1b) - => 2a) [‘a’..’z’]-[‘A’..’E’, ‘k’] => [‘a’..’j’, ‘i’..’z’]2b) [‘A’..’E’, ‘k’] - [‘a’..’z’] => [‘A’..’E’]3a) - => 3b) - =>

Операция вхождения . Это операция, устанавливающая связь между множеством и скалярной величиной, тип которой совпадает с базовым типом множества. Если x - такая скалярная величина, а M - множество, то операция вхождения записывается так: x in M.

Результат - логическая величина true, если значение x входит в множество M, и false - в противном случае.

Например, 4 in –– true, 5 in –– false.

Используя данную операцию, можно не только работать с элементами множества, но и, даже если в решении задачи явно не используются множества, некоторые логические выражения можно записать более лаконично.

1) Натуральное число n является двухзначным. Вместо выражения (n >= 10) and (n <=99) можно записать n in .

2) Символ c является русской буквой. Вместо выражения (c >= ‘А’) and (c <= ‘Я’) or (c>=‘а’) and (c<=‘п’) or (c>=‘р’) and (c<=‘я’) пишем c in [‘А’.. ‘Я’, ‘а’.. ‘п’, ‘р’.. ‘я’] и т.д.

Добавить новый элемент в множество можно с использованием операции объединения. Например, a:= a+ Для этих же целей в Turbo Pascal 7.0 предназначена процедура Include: include (M, A) M – множество, A – переменная того же типа, что и элементы множества M. Тот же пример можно записать так: Include (a, 5)

Исключить элемент из множества можно с помощью операции «разность множеств». Например, a:= a- Для этих же целей в Turbo Pascal 7.0 предназначена процедура Exclude: exclude (M, A) M – множество, A – переменная того же типа, что и элементы множества M. Тот же пример можно записать так: Exclude (a, 5)

Рассмотрим несколько примеров использования множеств при решении задач.

Задача 1. В городе имеется n высших учебных заведений, которые производят закупку компьютерной техники. Есть шесть компьютерных фирм: «Диалог», «Avicom», «Нэта», «Сервер», «Декада», «Dega.ru». Ответить на следующие вопросы:
1) в каких фирмах закупка производилась каждым из вузов?
2) в каких фирмах закупка производилась хотя бы одним из вузов?
3) в каких фирмах ни один из вузов не закупал компьютеры?

Решим задачу с использованием множеств. Для удобства дальнейших манипуляций в порядке следования занумеруем компьютерные фирмы, начиная с единицы. Занесём информации о месте закупок компьютеров каждым из вузов в отдельное множество.

Ответ на первый вопрос можно получить, выполнив пересечение всех таких множеств.

Ответ на второй вопрос – результат объединения множеств.

И, наконец, на последний – разность множества всех фирм и множества фирм, где хотя бы один вуз делал покупки.

Program ex_set_1;type firma = set of 1..6; v = array of firma;const f: array of string = ("Диалог", "Avicom", "Нэта", "Сервер", "Декада", "Dega.ru");{процедура ввода информации о закупке компьютеров в очередной фирме}procedure vvod(var a: firma);var i: byte; ans: 0..1;begin a:= ; for i:= 1 to 6 do begin Write("Вуз покупал компьютеры в фирме ", f[i], " (1 - да, 0 - нет)? "); ReadLn(ans); if ans = 1 then a:=a+[i] end;end;{процедура вывода элементов массива, номера которых содержатся в множестве}procedure Print(a: firma);var i: byte;begin for i:= 1 to 6 do if i in a then write(f[i]:10); writelnend;{Процедура, дающая ответ на первый вопрос}procedure Rez1(a: v; n: byte; var b: firma);var i: byte;begin b:= ; for i:= 0 to n-1 do b:= b * a[i];end;{Процедура, дающая ответ на второй вопрос}procedure Rez2(a: v; n: byte; var b: firma);var i: byte;begin b:= ; for i:= 0 to n-1 do b:= b + a[i];end;var a: v; n, i: byte; c: firma;begin write("Сколько вузов делали закупку? "); readln(n); for i:= 0 to n-1 do vvod(a[i]); Rez1(a, n, c); writeln("Каждый из вузов закупил компьютеры в фирмах: "); Print(c); Rez2(a, n, c); writeln("Хотя бы один из вузов закупил компьютеры в фирмах: "); Print(c); writeln("Ни один из вузов не закупил компьютеры в фирмах: "); Print(-c);end.

Задача 2. Сгенерировать n множеств (нумерацию начать с 1). Вывести элементы, которые входят во все множества с номерами, кратными трём, но не входят в первое множество.

Program ex_set_2;type mn = set of byte; v = array of mn;{процедура ввода информации в очередное множество}procedure vvod(var a: mn);var i, n, vsp: byte;begin a:= ; n:= 1 +random(200); for i:= 1 to n do begin vsp:= random(256); a:=a+ end;end;{процедура вывода элементов множества}procedure Print(a: mn);var i: byte;begin for i:= 0 to 255 do if i in a then write(i:4); writelnend;{Процедура, дающая ответ на вопрос}procedure Rez(a: v; n: byte; var b: mn);var i: byte;begin b:= ; i:= 3; while i <= n do begin b:= b * a[i]; i:= i + 3 end; b:= b - aend;var a: v; n, i: byte; c: mn;begin randomize; write("Сколько множеств? "); readln(n); for i:= 1 to n do begin vvod(a[i]); print (a[i]) end; Rez(a, n, c); Print(c);end.

Program ex_set_3;var m: set of char; s: string; i: byte;begin write("Введите строку: "); readln(s); m:=; i:= 1; while i <= length(s) do if s[i] in m then delete(s, i, 1) else begin m:=m+]; i:= i + 1 end; writeln(s)end.

42. Программа поиска количества определенных символов в тексте.

Здесь представлены наиболее часто используемые функции. Приведем пример программы, определяющей количество символов и слов в произвольной строке символов .

program pr28;

const YES=1; {Константы, опpеделяющие является ли }

NO=0; { текущий символ элементом слова}

str: string;

nw, {Количество слов}

nc, {Количество символов}

inword: integer; {Пеpеменная, пpинимающая значения

констант YES или NO}

i: integer;

writeln("Введите стpоку символов:");

read (str);

nw:=0;nc:=0;inword:=NO;

for i:=1 to length(str) do

nc:=nc+1;

if str[i] in [":",".",",",""","!","?",";"," "]{Если pазделитель,}

then inword:=NO {то текущий символ вне слова}

if inword=NO then

begin inword:=YES;

nw:=nw+1;

writeln ("nc=",nc,"nw=",nw);


43. Символьный тип данных в языке Турбо-Паскаль.

Инструкция

Существует несколько способов сортировки массива. Наиболее простая для алгоритмизации - «пузырьковая» сортировка, однако она же относится к самым медленным. Суть данного метода заключается в последовательном проходе по массиву данных и сравнении каждой пары элементов. Если нижестоящий элемент оказывается меньше предыдущего, производится обмен местами. Далее алгоритм начинается сначала. Пример кода сортировки на языке С:

int mаss ;
int el_min=10;

for (int i=0; ii; j--)
if (lеss(mаss [j], mаss ))
swаp(mаss [j], mаss );
}

Одним из оптимальных алгоритмов сортировки массива по возрастанию считается упорядочивание методом вставок. Суть алгоритма заключается в формировании заданной последовательности среди группы элементов (по возрастанию). Специальный обработчик в цикле проверяет массив на упорядоченность. Для сортировки по возрастанию задается следующее условие. Если последующий элемент меньше предыдущего, он изымается со своего места и помещается на то, которое соответствует его значению. Пример кода программы сортировки по возрастанию на языке С:

int Kol = 40;
int mаss , k;

for (int i = 1, j=0; i{
k = mаss [i]; // вспомогательная переменная для хранения элемента массива
j = i - 1;
while (k {
mаss = mаss [j];
j--;
if (j mаss = k;
}
}

Еще один из часто используемых методов сортировки – алгоритм упорядочивания через поиск минимального или максимального элемента в массиве. При сортировке по возрастанию в момент первого прохода по массиву находится его элемент с самым минимальным значением и помещается в начало массива. На его же место устанавливается элемент, занимавший ранее первую позицию. При дальнейшем рассмотрении массива заполненное место исключается. Ищется следующий минимальный элемент, помещается уже на второе место и т.д., пока весь массив не будет отсортирован. Код сортировки методом нахождения минимального элемента списка:

int mаss , bb;
int Kоl = 30, min, pоs;

for (int i = 0; i{
min = mаss [i];
pоs = i;
for (int j=0; j {
if (mаss [j] {
min = mаss [j];
pоs = j;
}
bb = mаss [i];
mаss [i] = mаss ;
mаss = bb;
}
}

Способы упорядочивания элементов массивов зависят от инструментов, которые имеются у вас в распоряжении. Ниже приведены несколько вариантов упорядочивания одномерных массивов при использовании наиболее распространенного серверного языка программирования PHP. Самостоятельно составлять функции для перебора элементов массива, их сравнения и присвоения новых значений при использовании этого языка не требуется - все это делают встроенные функции.

Инструкция

Используйте функцию sort(), если надо выстроить данные в массиве в порядке их возрастания. Например:$values = array(58, 15, 2.41, 26, 30);
sort($values);В результате применения изменится расположения данных в массиве - он станет таким: (2.41, 15, 26, 30, 58). Если в вызов функции добавить флаг SORT_STRING, то функция будет считать данные массива строковыми и выстраивать их по . Так как знак строковой переменной «2.41» в алфавите располагается дальше, чем первый знак строковой переменной «15», то после применения функции sort($values, SORT_STRING) переменные выстроятся иначе: (15, 2.41, 26, 30, 58).

Воспользуйтесь функцией rsort() при необходимости упорядочить массив в порядке убывания его значений. Эта функция отличается от описанной в первом шаге только порядком сортировки.

Применяйте функцию asort(), если необходимо упорядочить в порядке возрастания значения именованного (ассоциативного) массива, не изменяя при этом исходных соответствий между индексом и значением каждого элемента массива. Например:$values = array("one" => 58, "two" => 15, "three" => 2.41, "four" => 26, "five" => 30);
asort($values);В результате порядок следования элементов массива станет таким: ("three" => 2.41, "two" => 15, "four" => 26, "five" => 30, "one" => 58). В остальном действие этой функции не отличается от описанной в первом шаге функции sort. Для аналогичного упорядочивания элементов в порядке убывания используйте функцию arsort().

Доброго времени суток, уважаемые читатели нашего блога! На нашем сайте мы уже касались темы массивов и это был пример того, как сделать . Также уже была статья о том, для решения этой задачи тоже были использованы массивы. А сегодня речть пойдет о том, как отсортировать многомерный массив . Итак, приступим.
Возьмем массив «goods» следующего вида:

200, "manufacture" => "ТОО Целина"); $goods = array("price" => 400, "manufacture" => "ИП Девяткин"); $goods = array("price" => 800, "manufacture" => "АО Аграрник"); $goods = array("price" => 790, "manufacture" => "ЗАО Красный Восток"); ?>

Необходимо отсортировать данный массив по ключу. Для этого воспользуемся функцией «ksort»:

ksort ($goods); print_r($goods); ?>

В результате получаем отсортированный массив по ключу:

Array ( => Array ( => 400 => ИП Девяткин) => Array ( => 200 => ТОО Целина) => Array ( => 800 => АО Аграрник) => Array ( => 790 => ЗАО Красный Восток))

Как видим, ключи идут в порядке возрастания от 45 до 89. Теперь нужно отсортировать массив по значению ключа «price» для этого воспользуемся функцией «uasort» и напишем для неё пользовательскую функцию «sort_p»:

sort_p ($a, $b) { return strcmp($a["price"], $b["price"]); } uasort ($goods, "sort_p" ); print_r($goods); ?>

В результате получаем отсортированный массив по ключу «price»:

Array ( => Array ( => 200 => ТОО Целина) => Array ( => 400 => ИП Девяткин) => Array ( => 790 => ЗАО Красный Восток) => Array ( => 800 => АО Аграрник))

Как видим, значения ключа «price» идут в порядке возрастания от 200 до 800. Чтобы значения ключа «price» шли в обратном порядке, по убыванию, поменяем местами параметры функции «strcmp» в пользовательской функции «sort_p»:

b ["price"], $a ["price"]); } uasort($goods, "sort_p"); print_r($goods); ?>

Получим следующий результат:

Array ( => Array ( => 800 => АО Аграрник) => Array ( => 790 => ЗАО Красный Восток) => Array ( => 400 => ИП Девяткин) => Array ( => 200 => ТОО Целина))

Как видим, теперь значения ключа «price» идут в порядке убывания от 800 до 200. Теперь нужно отсортировать массив по значению двух ключей «manufacture» и «price» для этого напишем пользовательскую функцию «sort_pm»:

sort_pm ($a, $b) { $r1 = strcmp($a["manufacture"], $b["manufacture"]$a["price"], $b["price"]) : $r1; } uasort($goods, "sort_pm" ); print_r($goods); ?>

Теперь сортировка происходит по значениям двух ключей в порядке возрастания, приоритетным является ключ «manufacture».

Array ( => Array ( => 800 => АО Аграрник) => Array ( => 790 => ЗАО Красный Восток) => Array ( => 400 => ИП Девяткин) => Array ( => 200 => ТОО Целина))

Если для Вас более приоритетным являются значения ключа «price», то поменяйте местами параметры функций «strcmp» и запишите функцию «sort_pm» следующим образом:

$a["price"], $b["price"] ); return ($r1 == 0) ? strcmp() : $r1; } uasort($goods, "sort_pm"); print_r($goods); ?>

То есть были изменены параметры функций «strcmp». Теперь значения ключа «price» будут приоритетнее, значит сортировка в первую очередь будет осуществлятся по ним, затем будут отсортированы значения ключа «manufacture». Поясним на следующем примере:

200, "manufacture" => "ТОО Целина"); $goods = array("price" => 400, "manufacture" => "ИП Девяткин"); $goods = array("price" => 400, "manufacture" => "АО Праздник"); $goods = array("price" => 800, "manufacture" => "АО Аграрник"); $goods = array("price" => 790, "manufacture" => "ЗАО Красный Восток"); function sort_pm($a, $b) { $r1 = strcmp($a["price"], $b["price"] ); return ($r1 == 0) ? strcmp($a["manufacture"], $b["manufacture"] ) : $r1; } uasort($goods, "sort_pm"); print_r($goods); ?>

Чем больше массив анализируемых данных, тем труднее сконцентрировать внимание на их основных характеристиках. Чтобы лучше воспринять информацию, содержащуюся в наборе данных, их необходимо правильно организовать. Для этого используют либо упорядоченный массив, либо диаграмму «ствол и листья».

Упорядоченный массив

Упорядоченный массив (не обязательно одномерный) состоит из последовательности данных, расположенных по возрастанию. Например, таблица (рис. 1) содержит показатели о пятилетней среднегодовой доходности 158 фондов. Упорядоченные массивы позволяют сразу определить минимальное и максимальное значения, типичные величины, а также диапазон, которому принадлежит основная масса значений.

Рис. 1. Упорядоченный массив, содержащий данные о пятилетней среднегодовой доходности 158 фондов, ориентированных на быстрый рост капитала, за период с 1 января 1997 до 31 декабря 2001

Скачать заметку в формате или , примеры в формате

Видно, что наименьший уровень пятилетней среднегодовой доходности равен –6,1% в год, а наивысший достигает 26,3%. Кроме того, среднегодовые показатели большинства фондов колеблются в диапазоне от 5 до 15%. И всё же представление данных в виде двумерного массива (как на рис. 1) не является оптимальным, так как не позволяет быстро и легко создать сводную таблицу. Поэтому я рекомендую создавать одномерные вертикальные упорядоченные массивы. Excel предоставляет несколько возможностей для этого.

Рассмотрим в качестве сквозного примера среднемесячные температуры июля в Москве за 130 лет наблюдений (рис. 2).

Рис. 2. Среднемесячная температура июля в Москве; исходные данные

Простейший способ упорядочения массива данных предоставляется опцией Excel Сортировать . Выделите столбцы А и В; пройдите по меню Данные → Сортировка (рис. 3). Откроется меню Сортировка . В поле Сортировать по выберите Средняя температура июля, °C , в поле Порядок По возрастанию . Нажмите Ok.

Рис. 3. Сортировка данных

Вы получите отсортированный (упорядоченный) по температуре список (рис. 4). Сразу видно, что минимальная среднемесячная температура в июле была зафиксирована в Москве в 1904 г. – 14,6°С, а самая высокая – в 2010 г. – 26,1°С. Наверное, вы помните этот ужасный год!? Обратите внимание, что предыдущий рекорд был превышен более, чем на 10%.

Рис. 4. Упорядоченный список

Диаграмма «ствол и листья»

Диаграмма «ствол и листья» представляет собой инструмент для наглядной организации набора данных и анализа их распределения. Данные в диаграмме распределены в соответствии с первыми цифрами, или стволами, и замыкающими цифрами, или листьями. Например, число 18,9 в диаграмме «ствол и листья» состоит из ствола 18 и листа 9 (рис. 5). К сожалению, Excel не умеет автоматически строить диаграмму «ствол и листья». Поэтому воспользуемся ручной процедурой. В качестве ствола используем целую часть температуры, а в качестве листьев – десятичную (см. формулы на листе «Ствол и листья» Excel-файла; сначала я выделил дробную часть, затем перенес дроби из столбцов в строки, и, наконец, отформатировал диаграмму для придания ей большей наглядности).

Рис. 5. Диаграмма «ствол и листья»

Диаграмма «ствол и листья» визуализирует большой массив информации. Например, по ней непосредственно можно определить минимальное (14,6) и максимальное (26,1) значения. Видно, что большинство значений попадают в диапазон 16…20°С, а сами значения образуют со средним около 18°С. Также наблюдается довольно широкий хвост в области бо льших значений.

Контрольные задания

  1. Данные, приведенные ниже, содержат количество чеков, возвращенных 23 банками своим вкладчикам ввиду отсутствия средств на счете. (Минимальный размер вклада не должен быть ниже 100 долл.): 26 28 20 20 21 22 25 25 18 25 15 20 18 20 25 25 22 30 30 30 15 20 29.
    1. Постройте диаграмму «ствол и листья», содержащую указанные данные.
    2. Определите значение, вокруг которого концентрируется распределение количества возвращенных чеков.
  2. Данные, приведенные ниже, содержат величину ежемесячной платы за услуги (в долларах), взимаемой 26 банками со своих клиентов, если сумма на счету клиента не превышает установленного минимума, равного 1500 долл.: 12 8 5 5 6 6 10 10 9 7 10 7 7 5 0 10 6 9 12 0 5 10 8 5 5 9.
    1. Создайте упорядоченный массив, содержащий указанные данные.
    2. Постройте диаграмму «ствол и листья, содержащую указанные данные.
    3. Какой способ представления данных более информативен? Обоснуйте свой ответ.
    4. Определите значение, вокруг которого концентрируется распределение ежемесячной оплаты банковских услуг.

Ответы на контрольные задания

1. См. лист «КонтрЗад1» Excel-файла и рис. 6. Диаграмма «ствол и листья» более информативна, чем упорядоченный массив, так как лучше визуализирует данные. Среднее значение составляет приблизительно 22. Хитрость задания заключается в выборе шага для значений ствола. Если в качества шага выбрать число десятков (10, 20, 30), диаграмма «ствол и листья» потеряет в своей наглядности.