相同测试数据下,为什么快速排序比插入排序都慢呢!!!?
对应代码:
/**
* 插入排序:寻找元素arr[i]合适的插入位置,使索引数组索引为[i]之前的元素有序
*/
function insertionSort($arr)
{
for( $i = 1 ; $i < count($arr) ; $i ++ ) {
// 寻找元素arr[i]合适的插入位置
// 写法1
// for( $j = $i ; $j > 0 ; $j-- )
// if( $arr[$j] < $arr[$j-1] )
// $arr = swap($arr,$j);
// else
// break;
// 写法2,插入排序和选择排序最大区别是插入排序可以提前结束
// for( $j = $i ; $j > 0 && $arr[$j] < $arr[$j-1] ; $j -- )
// $arr = swap( $arr,$j);
// 写法3,减少交换赋值次数(上两种写法交换一次会有三次赋值),提升性能
$e = $arr[$i];
for ($j = $i; $j > 0 && $arr[$j-1] > $e; $j--)
$arr[$j] = $arr[$j-1];
// j保存元素e应该插入的位置
$arr[$j] = $e;
}
return $arr;
}
/**
* 快速排序
* @param array $array
* @return array
*/
function quickSort($arr)
{
//先判断是否需要继续进行
$length = count($arr);
if ($length <= 1) {
return $arr;
}
//写法1,选择一个标尺,通常选择第一个元素
$base_num = $arr[0];
//写法2,随机选择一个值作为标尺
// $arr = swap_arr($arr,0, mt_rand()%$length);
// $base_num = $arr[0];
//初始化
$left = array();//小于标尺的
$right = array();//大于标尺的
for ($i = 1; $i < $length; $i++) {
if ($base_num > $arr[$i]) {
$left[] = $arr[$i];
} else {
$right[] = $arr[$i];
}
}
//递归调用并记录
$left = quickSort($left);
$right = quickSort($right);
//合并
return array_merge($left, array($base_num), $right);
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论