计算机中的排序实际上分为两大类:
(1)内部排序(Internal Sorting):待排序的记录全部存放在计算机内存中进行的排序;
(2)外部排序(External Sorting):待排序的记录数量很大,内存不能存储全部记录,需要对外存进行访问排序;
而我们一般在算法中说的排序一般为内部排序,接下来我们在PHP中简单实现一下几个基本的排序算法。注意该代码只适用于索引数组,且为数字排序
直接插入排序
思想:每次从无序表中取出第一个元素,把它插入到有序表的合适位置,使有序表仍然有序
时间复杂度:O(n^2)
function insertSort(array $data){
if(empty($data)) return array();
$len = count($data);
for($i=1; $i<$len; $i++){ //$data[0]为初始化的有序数组
$inx = $data[$i]; //将该元素插入到有序数组中
$j = $i;
while($j--){
if($inx < $data[$j]){ //增序排序,将数字大的元素放到最右边
$data[$j+1] = $data[$j];
}else{
break;
}
}
$data[$j+1] = $inx;
}
return $data;
}
冒泡排序
思想:元素相邻之间两两比较,每次比较后都把最大的数移动到最右端,就类似冒泡的泡泡一样,故得此名
时间复杂度:O(n^2)
function bubbleSort($data=array()){
if(empty($data)) return array();
$len = count($data);
$flag = true;
while($len--){ //两两比较【$len-1】轮
for($i=0; $i<$len; $i++){ //两两比较具体进行
if($data[$i] > $data[$i+1]){
$flag = false;
$data[$i] = $data[$i]+$data[$i+1];
$data[$i+1] = $data[$i]-$data[$i+1];
$data[$i] = $data[$i]-$data[$i+1];
}
}
if($flag){ //针对有序的数组
break;
}
}
return $data;
}
选择排序
思想:每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完。选择排序是不稳定的。
时间复杂度:O(n^2)
function selectSort($data=array()){
if(empty($data)) return array();
$len = count($data);
while($len--){
$i = $len;
while($i--){
if($data[$len] < $data[$i]){
$data[$len] = $data[$len] ^ $data[$i];
$data[$i] = $data[$len] ^ $data[$i];
$data[$len] = $data[$len] ^ $data[$i];
}
}
}
return $data;
}