算法归类
简单排序:插入排序、选择排序、冒泡排序(必学)
分治排序:快速排序、归并排序(必学)
分配排序:桶排序、基数排序
树状排序:堆排序(必学)
其他:计数排序(必学)、希尔排序
归并排序
原理:采用了分治思想,将待排序列分成一个个子序列,直到子序列只剩一个元素,然后停止拆分,然后对每个子序列边排序边合并。
phpcode实现
$data = array(2, 1, 3, 9, 4, 6, 5, 8, 7);
$output = mergeSort($data);
print_r($output);
function mergeSort($data) {
$dataNum = count($data);
if($dataNum <= 1) {
return $data;
}
$leftList = array_slice($data, 0, (int)($dataNum/2));
$rightList = array_slice($data, (int)($dataNum/2));
$leftList = mergeSort($leftList);
$rightList = mergeSort($rightList);
$output = merge($leftList, $rightList);
return $output;
}
function merge($leftList, $rightList) {
$result = array();
while(count($leftList) > 0 && count($rightList) > 0) {
if($leftList[0] <= $rightList[0]) {
array_push($result, array_shift($leftList));
} else {
array_push($result, array_shift($rightList));
}
}
array_splice($result, count($result), 0, $leftList);
array_splice($result, count($result), 0, $rightList);
return $result;
}
稳定性:稳定排序
空间复杂度:非原地排序,需要开辟新的空间,复杂度为O(n)
时间复杂度:
平均情况:O(n log n)
最坏情况:O(n log n)
最好情况:O(n log n)