标题php面试算法题-数组排序
//冒泡排序,
//两个元素依此比对,如果顺序错误,则调换顺序
/*$arr = [2,5,8,1,6,4];
for ($i=0;$i<count($arr)-1;$i++){
for ($j=0;$j<count($arr)-1-$i;$j++){
if ($arr[$j]>$arr[$j+1]){
$temp = $arr[$j];
$arr[$j] = $arr[$j+1];
$arr[$j+1] = $temp;
}
}
}
var_dump($arr);*/
//选择排序
//每次都找出整个队列里的最小值(或最大值),放在序列的起始位置,直到全部待排序的序列排完
//选择排序不稳定,(比如序列[5, 5, 3]第一次就将第一个[5]与[3]交换,导致第一个5挪动到第二个5后面)
/* $arr = [2,5,8,1,6,4];
$len = count($arr);
for($i=0; $i<$len-1;$i++){
$min_val = $arr[$i];
$min_index = $i;
for ($j=$i+1;$j<$len;$j++){
if ($min_val>$arr[$j]){
$min_val = $arr[$j];
$min_index = $j;
}
}
$temp = $arr[$i];
$arr[$i] = $min_val;
$arr[$min_index] = $temp;
}
var_dump($arr);*/
//插入排序
//它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。
//插入排序在实现上,通常采用in-place排序(即只需用到O(1)的额外空间的排序),
//因而在从后向前扫描过程中,需要反复把已排序元素逐步向后挪位,为最新元素提供插入空间。
//算法适用于少量数据的排序,时间复杂度为O(n^2)。是稳定的排序方法。
/* $arr = [2,3,8,1,6,4];
$len = count($arr);
for($i=1; $i<$len;$i++){
$temp = $arr[$i];
for ($j=$i-1; $j>=0;$j--){
if ($arr[$j]>$temp){
$arr[$j+1] = $arr[$j];
$arr[$j] = $temp;
}
}
}
var_dump($arr);*/
//快速排序
//通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小
//然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。
/*$arr = [2,3,8,1,6,4];
function quickSort($arr){
if (!isset($arr[1])) return $arr;
$mid = $arr[0]; //从数列中挑出一个元素,称为 “基准”(pivot),一般为首个元素,
$len = count($arr);
$left = $right = array();
for ($i=1;$i<$len;$i++) {
if ($mid > $arr[$i]){
$left[] = $arr[$i];
}else{
$right[] = $arr[$i];
}
}
$left = quickSort($left);
$left[] = $mid;
$right = quickSort($right);
return array_merge($left,$right);
}
print_r(quickSort($arr));*/
//归并排序
//将两个或者两个以上的有序表合成一个新的有序表,即把待排序的序列分成多个子序列,再将已有序的子序列合并,得到最终有序的序列
//递归分表,将数组一分为二,知道剩余一个元素为止
function mergeSort(array &$arr) {
$start = 0;
$end = count($arr) - 1;
Msort($arr,$start,$end);
}
function Msort(array &$arr, $start,$end) {
if ($start < $end) {
$mid = floor(($start + $end)/2);
Msort($arr,$start,$mid);
Msort($arr, $mid+1, $end);
Merge($arr,$start,$mid,$end);
}
}
function Merge(array &$arr,$start,$mid,$end) {
$i = $start;
$j = $mid + 1;
$k = $start;
$temp = array();
while ($i != $mid+1 && $j!=$end+1) {
if ($arr[$i] <= $arr[$j]){
$temp[$k++] = $arr[$i++];
}else{
$temp[$k++] = $arr[$j++];
}
}
while ($i != $mid + 1) {
$temp[$k++] = $arr[$i++];
}
while ($j != $end+1) {
$temp[$k++] = $arr[$j++];
}
for($i=$start; $i<=$end; $i++){
$arr[$i] = $temp[$i];
}
}
$arr = [2,3,0,1,6,4];mergeSort($arr);
print_r($arr);
转自原文:https://www.cnblogs.com/sunshineliulu/p/8573991.html
https://www.cnblogs.com/jing1208/p/6289840.html