大多数基本方法已经被deceze所覆盖,我会尝试查看其他类型的排序
使用SPL排序class SimpleHeapSort extends SplHeap {
public function compare($a, $b) {
return strcmp($a, $b);
}}// Let's populate our heap here (data of 2009)$heap = new SimpleHeapSort();$heap->insert("a");$heap->insert("b");$heap->insert("c");
echo implode(PHP_EOL, iterator_to_array($heap));
产量c
b
a
SplMaxHeap类提供堆的主要功能,保持最大值。$heap = new SplMaxHeap();$heap->insert(1);$heap->insert(2);$heap->insert(3);SplMinHeap类提供堆的主要功能,保持最小值。$heap = new SplMinHeap ();$heap->insert(3);$heap->insert(1);$heap->insert(2);
其他类型的排序
冒泡排序冒泡排序,有时被错误地称为下沉排序,是一种简单的排序算法,通过重复单步执行排序列表,比较每对相邻项目并交换它们(如果它们的顺序错误)。重复传递列表,直到不需要交换,这表明列表已排序。该算法的名称来自较小元素“冒泡”到列表顶部的方式。因为它只使用比较来操作元素,所以它是一种比较排序。尽管算法很简单,但大多数其他排序算法对于大型列表更有效。function bubbleSort(array $array) {
$array_size = count($array);
for($i = 0; $i
for($j = 0; $j
if ($array[$i]
$tem = $array[$i];
$array[$i] = $array[$j];
$array[$j] = $tem;
}
}
}
return $array;}
选择排序在计算机科学中,选择排序是一种排序算法,特别是就地比较排序。它具有O(n2)时间复杂度,使其在大型列表上效率低下,并且通常比类似的插入排序更差。选择排序因其简单性而着称,并且在某些情况下具有优于更复杂算法的性能优势,特别是在辅助存储器有限的情况下。function selectionSort(array $array) {
$length = count($array);
for($i = 0; $i
$min = $i;
for($j = $i + 1; $j
if ($array[$j]
$min = $j;
}
}
$tmp = $array[$min];
$array[$min] = $array[$i];
$array[$i] = $tmp;
}
return $array;}
插入排序插入排序是一种简单的排序算法,可以一次构建一个项目的最终排序数组(或列表)。与大多数高级算法(如快速排序,堆栈或合并排序)相比,它在大型列表上的效率要低得多。但是,插入排序提供了几个优点:function insertionSort(array $array) {
$count = count($array);
for($i = 1; $i
$j = $i - 1;
// second element of the array
$element = $array[$i];
while ( $j >= 0 && $array[$j] > $element ) {
$array[$j + 1] = $array[$j];
$array[$j] = $element;
$j = $j - 1;
}
}
return $array;}
希尔排序Shellsort,也称为Shell sort或Shell的方法,是一种就地比较排序。它通过在完成相邻元素之前开始比较和交换元素与远离的元素来概括交换排序,例如插入或冒泡排序。function shellSort(array $array) {
$gaps = array(
1,
2,
3,
4,
6
);
$gap = array_pop($gaps);
$length = count($array);
while ( $gap > 0 ) {
for($i = $gap; $i
$tmp = $array[$i];
$j = $i;
while ( $j >= $gap && $array[$j - $gap] > $tmp ) {
$array[$j] = $array[$j - $gap];
$j -= $gap;
}
$array[$j] = $tmp;
}
$gap = array_pop($gaps);
}
return $array;}
梳理排序梳子排序是一种相对简单的排序算法,最初由Wlodzimierz Dobosiewicz于1980年设计。后来它被Stephen Lacey和Richard Box在1991年重新发现。梳子排序改进了冒泡排序。function combSort(array $array) {
$gap = count($array);
$swap = true;
while ( $gap > 1 || $swap ) {
if ($gap > 1)
$gap /= 1.25;
$swap = false;
$i = 0;
while ( $i + $gap
if ($array[$i] > $array[$i + $gap]) {
// swapping the elements.
list($array[$i], $array[$i + $gap]) = array(
$array[$i + $gap],
$array[$i]
);
$swap = true;
}
$i ++;
}
}
return $array;}
合并排序在计算机科学中,合并排序(通常拼写为mergesort)是基于O(n log n)比较的排序算法。大多数实现产生稳定的排序,这意味着实现保留排序输出中相等元素的输入顺序function mergeSort(array $array) {
if (count($array) <= 1)
return $array;
$left = mergeSort(array_splice($array, floor(count($array) / 2)));
$right = mergeSort($array);
$result = array();
while ( count($left) > 0 && count($right) > 0 ) {
if ($left[0] <= $right[0]) {
array_push($result, array_shift($left));
} else {
array_push($result, array_shift($right));
}
}
while ( count($left) > 0 )
array_push($result, array_shift($left));
while ( count($right) > 0 )
array_push($result, array_shift($right));
return $result;}
快速排序Quicksort或分区交换排序是Tony Hoare开发的排序算法,平均来说,O(n log n)比较可以对n项进行排序。在最坏的情况下,它会进行O(n2)比较,尽管这种行为很少见。function quickSort(array $array) {
if (count($array) == 0) {
return $array;
}
$pivot = $array[0];
$left = $right = array();
for($i = 1; $i
if ($array[$i]
$left[] = $array[$i];
} else {
$right[] = $array[$i];
}
}
return array_merge(quickSort($left), array(
$pivot ), quickSort($right));}
排列排序置换排序,通过生成输入数组/列表的可能排列继续进行,直到发现排序的排列。function permutationSort($items, $perms = array()) {
if (empty($items)) {
if (inOrder($perms)) {
return $perms;
}
} else {
for($i = count($items) - 1; $i >= 0; -- $i) {
$newitems = $items;
$newperms = $perms;
list($foo) = array_splice($newitems, $i, 1);
array_unshift($newperms, $foo);
$res = permutationSort($newitems, $newperms);
if ($res) {
return $res;
}
}
}}function inOrder($array) {
for($i = 0; $i
if (isset($array[$i + 1])) {
if ($array[$i] > $array[$i + 1]) {
return False;
}
}
}
return True;}
基数排序在计算机科学中,基数排序是一种非比较整数排序算法,它通过将密钥按照共享相同有效位置和值的各个数字对密钥进行分组来对整数密钥进行排序。// Radix Sort for 0 to 256function radixSort($array) {
$n = count($array);
$partition = array();
for($slot = 0; $slot
$partition[] = array();
}
for($i = 0; $i
$partition[$array[$i]->age & 0xFF][] = &$array[$i];
}
$i = 0;
for($slot = 0; $slot
for($j = 0, $n = count($partition[$slot]); $j
$array[$i ++] = &$partition[$slot][$j];
}
}
return $array;}