五个常用的排序算法

记录学习的一些内容,希望和大家分享一下,互相学习~~

## 一、冒泡排序法

(1)PHP实现

<?php

/**
 * 冒泡算法(升序)
 * @param  [type] $arr [description]
 * @return [type]      [description]
 */
function arrSort($arr)
{
    if(empty($arr)) {
		return $arr;
	}

	$len = count($arr);
	for ($i = 0; $i < $len; $i++) {
		for($j = 0; $j < $len - $i - 1; $j++) {
			if($arr[$j] > $arr[$j+1]) {
				$tmp = $arr[$j];
				$arr[$j] = $arr[$j+1];
				$arr[$j+1] = $tmp;
			}
		}
	}

	return $arr;
}

$arr = [10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0];

$arr = arrSort($arr);

var_dump($arr);
exit;

## 二、选择排序法

(1)PHP实现
 

<?php

/**
 * 选择排序(升序)
 * @param  [type] $arr [description]
 * @return [type]      [description]
 */
function arrSort($arr)
{
	if(empty($arr)) {
		return $arr;
	}

	$len = count($arr);

	for($i = 0; $i < $len - 1; $i++) {
		$p = $i;
		for ($j = $i + 1; $j < $len; $j++) {
			if($arr[$p] > $arr[$j]) {
				$p = $j;
			}
		}

		if($p != $i) {
			$tmp = $arr[$i];
			$arr[$i] = $arr[$p];
			$arr[$p] = $tmp;
		}
	}
	return $arr;
}

$arr = [10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0];

$arr = arrSort($arr);
var_dump($arr);
exit;

## 三、插入排序法

(1)PHP实现

<?php

/**
 * 插入排序(升序排列)
 * @param  [type] $arr [description]
 * @return [type]      [description]
 */
function arrSort($arr)
{
	if(empty($arr)) {
		return $arr;
	}

	$len = count($arr);

	for($i = 1; $i < $len; $i++) {
		$current = $arr[$i];
		$pIndex = $i - 1;

		while($pIndex >= 0 && $arr[$pIndex] > $current) {
			$arr[$pIndex+1] = $arr[$pIndex];
			$pIndex--;
		}
		$arr[$pIndex+1] = $current;
	}

	return $arr;
}

$arr = [10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0];

$arr = arrSort($arr);
var_dump($arr);
exit;

## 四、快速排序法

(1)PHP实现

<?php

/**
 * 快速排序(升序)
 * @param  [type] $arr [description]
 * @return [type]      [description]
 */
function arrSort($arr)
{

	$len = count($arr);

	// 递归结束条件
	if($len <= 1) {
		return $arr;
	}

	$base = $arr[0];

	$leftArray  = [];
	$rightArray = [];

	for ($i = 1; $i < $len; $i++) {
		if($arr[$i] < $base) {
			$leftArray[]  = $arr[$i];
		} else {
			$rightArray[] = $arr[$i];
		}
	}

	$leftArray = arrSort($leftArray);
	$rightArray = arrSort($rightArray);

	return array_merge($leftArray, [$base], $rightArray);
}

$arr = [10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0];
$arr = arrSort($arr);
var_dump($arr);
exit;

## 五、归并排序

(1)PHP实现

<?php

/**
 * 排序
 * @param  [type] $left  [description]
 * @param  [type] $right [description]
 * @return [type]        [description]
 */
function arrMerge($left, $right)
{
    $result = [];

    while(count($left) > 0 && count($right) > 0) {
        $result[] = $left[0] < $right[0] ? array_shift($left) : array_shift($right);
    }

    while (count($left)) {
        $result[] = array_shift($left);
    }

    while(count($right)) {
        $result = array_shift($right);
    }

    return $result;
}

/**
 * 归并排序
 * @param  [type] $arr [description]
 * @return [type]      [description]
 */
function arrSort($arr)
{
    $len = count($arr);
    if ($len < 2) {
        return $arr;
    }

    $middle = floor($len / 2);

    $left = array_slice($arr, 0, $middle);
    $right = array_slice($arr, $middle);

    return arrMerge(arrSort($left), arrSort($right));
}

$arr = [10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0];
$arr = arrSort($arr);
var_dump($arr);
exit;

PS:参考博客https://www.cnblogs.com/onepixel/articles/7674659.html

猜你喜欢

转载自blog.csdn.net/empty0812/article/details/81363301