归并排序(英语:Merge sort,或 mergesort),是创建在归并操作上的一种有效的排序算法,效率为 O(nlogn)
。1945 年由约翰·冯·诺伊曼首次提出。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用,且各层分治递归可以同时进行。
采用分治法:
- 分割:递归地把当前序列平均分割成两半。
- 集成:在保持元素顺序的同时将上一步得到的子序列集成到一起(归并)。
归并操作(merge),也叫归并算法,指的是将两个已经排序的序列合并成一个序列的操作。归并排序算法依赖归并操作。
<?php
function mergeSort($arr) { $len = count($arr); if ($len <= 1) { return $arr; }
$mid = $len / 2; $left = array_slice($arr, 0, $mid); $right = array_slice($arr, $mid); $left = mergeSort($left); $right = mergeSort($right);
$arr = merge($left, $right); return $arr; }
function merge($arrA, $arrB) { $arrC = array(); while (count($arrA) && count($arrB)) { $arrC[] = $arrA[0] < $arrB[0] ? array_shift($arrA) : array_shift($arrB); }
return array_merge($arrC, $arrA, $arrB); }
$startTime = microtime(1);
$arr = range(1, 1000); shuffle($arr); echo 'before sort: ', implode(', ', $arr), "\n"; $sortArr = mergeSort($arr); echo 'after sort: ', implode(', ', $sortArr), "\n";
echo 'use time: ', microtime(1) - $startTime, "s\n";
|
假设被排序的数列中有 N 个数。遍历一趟的时间复杂度是 O(N)
,需要遍历多少次呢?
归并排序的形式就是一棵二叉树,它需要遍历的次数就是二叉树的深度,而根据 完全二叉树 的可以得出它的时间复杂度是 O(N*lgN)
。
References
– EOF –