Сортировать определённое число элементов массива. Как упорядочить массив данных. Алгоритм "Сортировка пузырьком"

Доброго времени суток, уважаемые читатели нашего блога! На нашем сайте мы уже касались темы массивов и это был пример того, как сделать . Также уже была статья о том, для решения этой задачи тоже были использованы массивы. А сегодня речть пойдет о том, как отсортировать многомерный массив . Итак, приступим.
Возьмем массив «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); ?>

Рrogram Sort_Obmen;

var а:array of integer;

n,i,k,x: integer;

begin write("количество элементов массива ");

for i:=1 to n do read([i]);

for k:=n-1 downto 1 do {количество сравниваемых пар}

for i:=1 to k do if a[i]>a then {меняем местами соседние элементы}

for i:=1 to n do write(a[i]," "); {упорядоченный массив}

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

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

Имя фала : FastSort.pas

Procedure FastSort(Var aa:Massive);

Var ii,kk,nn:byte;

For ii:=1 to nn-1 Do Begin

If (aa>aa) Then Begin

Swap (aa,a);

В то время, как при сортировке предыдущем методом для массива из 10 элементов понадобится 9 проходов, для данного алгоритма это число может уменьшиться. К примеру, массив из значений (1,-3,7,-10,11,4,-6,2,5,-4) будет отсортирован за 8 проходов, а массив (1,4,3,2,4,5,6,7,10,11) – всего за 1.

Следуя похожей, логике отсортируем массив по возрастанию:

Имя фала : Sort_Inc.pas

Procedure Sort_Inc(Var aa:Massive);

For kk:=1 to n-1 Do Begin

For ii:=1 to n-kk Do Begin

If (aa>aa) Then Begin

Swap (aa,a);

Обработка двумерных массивов

Основные принципы ввода двумерных массивов во многом схожи с принципами ввода одномерных. При его описании можно ссылать на введенные как константы число строк матрицы MиN, например

Type Matrix=array of Real;

Var a,b,c,d: Matrix;

e: array of Byte;

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

Заметим, что двумерный массив всегда можно развернуть в одномерный, а одномерный – свернуть в двумерный. Рассмотрим примеры решения задач на практическом занятии.

Литература Основная литература

    Ахметов К.С. Курс молодого бойца. Изд. 5-е. М., Компьютер-Пресс,1998.

    Фигурнов В.Э. IBM PC для пользователя. Изд. 7-е. М., Инфра-М, 1997, и 1999.

    Александр Левин Самоучитель Работы на компьютере 8-ое издание Раздел «из чего состоит компьютер." – Питер, 2004 г.

    Электронное методическое пособие МГАПИ 2005 г.

    Алексеев Е.Р., Чеснокова О.В., Павлыш в.Р., Славинская Л.Ф. Турбо Паскаль 7.0 2-ое издание – NT Press, М., 2006 г.

    Коротаев Д.Г. TURBO-PASCAL в примерах и задачах. Учебное пособие МГАПИ, М, 2000 г.

    Программирование на языке Паскаль Задачник. Под редакцией О.Ф.Усковой – Питер, 2003 г.

    Фаронов В.В. Учебное пособие Turbo - Pascal - Питер, 2007.

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

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 , итерации через него и создания $ упорядоченного массива.

Часто при решении определенных задач требуется сделать сортировку данных, которые хранятся в массиве. Что такое сортировка массивов? Вот, например, играя в преферанс, люди раскладывают свои карты по значению и масти. Это дает возможность определить, каких еще карт им не хватает. А в словарях все упорядочивается по алфавиту. Примеров можно привести много. Сортировка - перегруппировка определенного множества объектов в каком-либо порядке по заданному признаку. Сортировка массивов требуется довольно часто. Для этого применяются разные методы. Чтобы понять их суть, достаточно рассмотреть подробно несколько способов.

На основе чего делают

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

Главные различия функций

Сортировка возможна при помощи разных функций. Давайте рассмотрим, чем они отличаются:

Одни функции сортируют массивы по ключам их элементов, а другие - по значениям.

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

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

Каждая функция осуществляет модификацию переданного массива. Отсортированную копию они не возвращают.

Порядок сортировки считается неопределенным, когда функция определяет два элемента, как равные. Это нестабильная сортировка.

Некоторые функции сортировки массивов в PHP

Функции sort() и rsort() . Sort() упорядочивает в алфавитном порядке массив. Обратим внимание: данная функция чувствительна к регистру. Происходит сортировка по значениям без учета ключей. Rsort() сортирует в обратном порядке тоже по значениям и не учитывает ключи.

Asort() - это одна из функций, сохраняющая отношения ключей и значений. Ее полезно применять для ассоциативных массивов, когда это важно.

В примере ключами выбраны наименования фруктов, а значения - это цены. Сортировка происходит по возрастанию цены. Если необходима сортировка по то нужна функция ksort (), которая делает сортировку по ключам. Arsort () осуществляет сортировку с индексами (описательными) по убыванию значений. Krsort () сортирует по убыванию ключей элементов.

Двумерный массив

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

В примере у нашей функции имя compare (сравнение). У нее 2 аргумента - x, y. Функция должна принять 2 значения, после чего определить порядок. Параметры x, y - 2 массива, которые находятся внутри y основного массива. Чтобы сравнивать description-элементы из массивов, что переданы в функцию, нужны переменные $x, $y. В строке return1 происходит возвращение значения коду, который вызвал функцию. В основе сортировки нашего массива функция usort(). Сортировка идет по правилам, которые описывает функция compare().

Теперь сортировка массивов в PHP станет для вас понятной.