数据结构和算法

常用排序算法的 PHP 实现

2017-09-21  本文已影响91人  Stone_Zhuo

排序概念

在计算机领域,排序是将原本无序的队列按照一定的规则分布而成为有序队列的过程,在程序开发中应用比较广泛。

排序种类

常见的排序算法有:冒泡排序,直接插入排序,折半插入排序,快速排序,计数排序,希尔排序,梳排序,选择排序。

排序实例

// 由小到大排序
$data = [3, 5, 2, 34, 4, 7, 23, 1];
$count = count($data);
for ($i = 0;$i < $count - 1;$i++) {
    for ($j = $i + 1;$j < $count;$j++) {
        if ($data[$i] > $data[$j]) {
            $tmp = $data[$i];
            $data[$i] = $data[$j];
            $data[$j] = $tmp;
        }
    }
}
echo '<pre>';
print_r($data);
echo '</pre>';
/*
Array
(
    [0] => 1
    [1] => 2
    [2] => 3
    [3] => 4
    [4] => 5
    [5] => 7
    [6] => 23
    [7] => 34
)
*/

// 由大到小排序
$data = [3, 5, 2, 34, 4, 7, 23, 1];
$count = count($data);
for ($i = 0;$i < $count - 1;$i++) {
    for ($j = $i + 1;$j < $count;$j++) {
        if ($data[$i] < $data[$j]) {
            $tmp = $data[$i];
            $data[$i] = $data[$j];
            $data[$j] = $tmp;
        }
    }
}
echo '<pre>';
print_r($data);
echo '</pre>';
/*
Array
(
    [0] => 34
    [1] => 23
    [2] => 7
    [3] => 5
    [4] => 4
    [5] => 3
    [6] => 2
    [7] => 1
)
*/
// 由小到大直接插入排序
$data = [3, 5, 2, 34, 4, 7, 23, 1];
$count = count($data);
for ($i = 1;$i < $count;$i++) {
    if ($data[$i-1] > $data[$i]) {
        $tmp = $data[$i];
        $j = $i;
        while ($j > 0 && $data[$j - 1] > $tmp) {
            $data[$j] = $data[$j - 1];
            $j--;
        }
        $data[$j] = $tmp;
    }
}
echo '<pre>';
print_r($data);
echo '</pre>';
/*
Array
(
    [0] => 1
    [1] => 2
    [2] => 3
    [3] => 4
    [4] => 5
    [5] => 7
    [6] => 23
    [7] => 34
)
*/

// 由大到小直接插入排序
$data = [3, 5, 2, 34, 4, 7, 23, 1];
$count = count($data);
for ($i = 1;$i < $count;$i++) {
    if ($data[$i-1] < $data[$i]) {
        $tmp = $data[$i];
        $j = $i;
        while ($j > 0 && $data[$j - 1] < $tmp) {
            $data[$j] = $data[$j - 1];
            $j--;
        }
        $data[$j] = $tmp;
    }
}
echo '<pre>';
print_r($data);
echo '</pre>';
/*
Array
(
    [0] => 34
    [1] => 23
    [2] => 7
    [3] => 5
    [4] => 4
    [5] => 2
    [6] => 3
    [7] => 1
)
*/
// 由小到大折半插入排序
$data = [3, 5, 2, 34, 4, 7, 23, 1];
$count = count($data);
for ($i = 1;$i < $count;$i++) {
    $left = 0;
    $right = $i - 1;
    $tmp = $data[$i];

    while ($left <= $right) {
        $middle = ($left + $right) / 2;
        if ($tmp < $data[$middle]) {
            $right = $middle - 1;
        } else {
            $left = $middle + 1;
        }
    }

    for ($j = $i;$j > $left;$j--) {
        $data[$j] = $data[$j - 1];
    }
    $data[$j] = $tmp;
}
echo '<pre>';
print_r($data);
echo '</pre>';
/*
Array
(
    [0] => 1
    [1] => 2
    [2] => 3
    [3] => 4
    [4] => 5
    [5] => 7
    [6] => 23
    [7] => 34
)
*/

// 由大到小折半插入排序
$data = [3, 5, 2, 34, 4, 7, 23, 1];
$count = count($data);
for ($i = 1;$i < $count;$i++) {
    $left = 0;
    $right = $i - 1;
    $tmp = $data[$i];

    while ($left <= $right) {
        $middle = ($left + $right) / 2;
        if ($tmp > $data[$middle]) {
            $right = $middle - 1;
        } else {
            $left = $middle + 1;
        }
    }

    for ($j = $i;$j > $left;$j--) {
        $data[$j] = $data[$j - 1];
    }
    $data[$j] = $tmp;
}
echo '<pre>';
print_r($data);
echo '</pre>';
/*
Array
(
    [0] => 34
    [1] => 23
    [2] => 7
    [3] => 5
    [4] => 4
    [5] => 2
    [6] => 3
    [7] => 1
)
*/
/*
 * 由小到大快速排序
 * @param array $param
 * @return array
 */
function quickSortAsc($param) {
    $count = count($param);
    if ($count <= 1) {
        return $param;
    }
    $base = $param[0];
    $small = [];
    $big = [];
    for ($i = 1;$i < $count;$i++) {
        if ($param[$i] > $base) {
            $big[] = $param[$i];
        } else {
            $small[] = $param[$i];
        }
    }
    return array_merge(quickSortAsc($small), [$base], quickSortAsc($big));
}
$data = [3, 5, 2, 34, 4, 7, 23, 1];
echo '<pre>';
print_r(quickSortAsc($data));
echo '</pre>';
/*
Array
(
    [0] => 1
    [1] => 2
    [2] => 3
    [3] => 4
    [4] => 5
    [5] => 7
    [6] => 23
    [7] => 34
)
*/

/*
 * 由大到小快速排序
 * @param array $param
 * @return array
 */
function quickSortAsc($param) {
    $count = count($param);
    if ($count <= 1) {
        return $param;
    }
    $base = $param[0];
    $small = [];
    $big = [];
    for ($i = 1;$i < $count;$i++) {
        if ($param[$i] > $base) {
            $big[] = $param[$i];
        } else {
            $small[] = $param[$i];
        }
    }
    return array_merge(quickSortAsc($big), [$base], quickSortAsc($small));
}
$data = [3, 5, 2, 34, 4, 7, 23, 1];
echo '<pre>';
print_r(quickSortAsc($data));
echo '</pre>';
/*
Array
(
    [0] => 34
    [1] => 23
    [2] => 7
    [3] => 5
    [4] => 4
    [5] => 3
    [6] => 2
    [7] => 1
)
*/
// 由小到大计数排序
$data = [3, 5, 2, 34, 4, 7, 23, 1];
$count = count($data);
$new_data = [];
for ($i = 0;$i < $count;$i++) {
    $location = 0;
    for ($j = 0;$j < $count;$j++) {
        if ($data[$i] > $data[$j]) {
            $location++;
        }
    }
    while (isset($new_data[$location]) && $location < $count) {
        $location++;
    }
    $new_data[$location] = $data[$i];
}
for ($i = 0;$i < $count;$i++) {
    $data[$i] = $new_data[$i];
}
echo '<pre>';
print_r($data);
echo '</pre>';
/*
Array
(
    [0] => 1
    [1] => 2
    [2] => 3
    [3] => 4
    [4] => 5
    [5] => 7
    [6] => 23
    [7] => 34
)
*/

// 由大到小计数排序
$data = [3, 5, 2, 34, 4, 7, 23, 1];
$count = count($data);
$new_data = [];
for ($i = 0;$i < $count;$i++) {
    $location = 0;
    for ($j = 0;$j < $count;$j++) {
        if ($data[$i] < $data[$j]) {
            $location++;
        }
    }
    while (isset($new_data[$location]) && $location < $count) {
        $location++;
    }
    $new_data[$location] = $data[$i];
}
for ($i = 0;$i < $count;$i++) {
    $data[$i] = $new_data[$i];
}
echo '<pre>';
print_r($data);
echo '</pre>';
/*
Array
(
    [0] => 34
    [1] => 23
    [2] => 7
    [3] => 5
    [4] => 4
    [5] => 2
    [6] => 3
    [7] => 1
)
*/
// 由小到大希尔排序
$data = [3, 5, 2, 34, 4, 7, 23, 1];
$count = count($data);
$random = 3;
$rank = 1;
while ($rank < $count / $random) {
    $rank = $random * $rank + 1;
}
while ($rank >= 1) {
    for ($i = $rank; $i < $count;$i++) {
        for ($j = $i;$j >= $rank;$j -= $rank) {
            if ($data[$j] < $data[$j - $rank]) {
                $tmp = $data[$j];
                $data[$j] = $data[$j - $rank];
                $data[$j - $rank] = $tmp;
            }
        }
    }
    $rank = intval($rank / $random);
}
echo '<pre>';
print_r($data);
echo '</pre>';
/*
Array
(
    [0] => 1
    [1] => 2
    [2] => 3
    [3] => 4
    [4] => 5
    [5] => 7
    [6] => 23
    [7] => 34
)
*/

// 由大到小希尔排序
$data = [3, 5, 2, 34, 4, 7, 23, 1];
$count = count($data);
$random = 3;
$rank = 1;
while ($rank < $count / $random) {
    $rank = $random * $rank + 1;
}
while ($rank >= 1) {
    for ($i = $rank; $i < $count;$i++) {
        for ($j = $i;$j >= $rank;$j -= $rank) {
            if ($data[$j] > $data[$j - $rank]) {
                $tmp = $data[$j];
                $data[$j] = $data[$j - $rank];
                $data[$j - $rank] = $tmp;
            }
        }
    }
    $rank = intval($rank / $random);
}
echo '<pre>';
print_r($data);
echo '</pre>';
/*
Array
(
    [0] => 34
    [1] => 23
    [2] => 7
    [3] => 5
    [4] => 4
    [5] => 3
    [6] => 2
    [7] => 1
)
*/
// 由小到大梳排序
$data = [3, 5, 2, 34, 4, 7, 23, 1];
$count = count($data);
$step = intval($count / 1.4);
while ($step >= 1) {
    for ($i = 0; $i < $count;$i++) {
        if ($step + $i < $count && $data[$i] > $data[$step + $i]) {
            $tmp = $data[$i];
            $data[$i] = $data[$i + $step];
            $data[$i + $step] = $tmp;
        }
        if ($step + $i >= $count) {
            break;
        }
    }
    $step = intval($step / 1.4);
}
echo '<pre>';
print_r($data);
echo '</pre>';
/*
Array
(
    [0] => 1
    [1] => 2
    [2] => 4
    [3] => 3
    [4] => 5
    [5] => 7
    [6] => 23
    [7] => 34
)
*/

// 由大到小梳排序
$data = [3, 5, 2, 34, 4, 7, 23, 1];
$count = count($data);
$step = intval($count / 1.4);
while ($step >= 1) {
    for ($i = 0; $i < $count;$i++) {
        if ($step + $i < $count && $data[$i] < $data[$step + $i]) {
            $tmp = $data[$i];
            $data[$i] = $data[$i + $step];
            $data[$i + $step] = $tmp;
        }
        if ($step + $i >= $count) {
            break;
        }
    }
    $step = intval($step / 1.4);
}
echo '<pre>';
print_r($data);
echo '</pre>';
/*
Array
(
    [0] => 34
    [1] => 23
    [2] => 7
    [3] => 5
    [4] => 4
    [5] => 3
    [6] => 2
    [7] => 1
)
*/
// 由小到大选择排序
$data = [3, 5, 2, 34, 4, 7, 23, 1];
$count = count($data);
for ($i = 0;$i < $count - 1;$i++) {
    $index = $i;
    for ($j = $i + 1; $j < $count;$j++) {
        if ($data[$index] > $data[$j]) {
            $index = $j;
        }
    }
    if ($index != $i) {
        $tmp = $data[$index];
        $data[$index] = $data[$i];
        $data[$i] = $tmp;
    }
}
echo '<pre>';
print_r($data);
echo '</pre>';
/*
Array
(
    [0] => 1
    [1] => 2
    [2] => 3
    [3] => 4
    [4] => 5
    [5] => 7
    [6] => 23
    [7] => 34
)
*/

// 由大到小选择排序
$data = [3, 5, 2, 34, 4, 7, 23, 1];
$count = count($data);
for ($i = 0;$i < $count - 1;$i++) {
    $index = $i;
    for ($j = $i + 1; $j < $count;$j++) {
        if ($data[$index] < $data[$j]) {
            $index = $j;
        }
    }
    if ($index != $i) {
        $tmp = $data[$index];
        $data[$index] = $data[$i];
        $data[$i] = $tmp;
    }
}
echo '<pre>';
print_r($data);
echo '</pre>';
/*
Array
(
    [0] => 34
    [1] => 23
    [2] => 7
    [3] => 5
    [4] => 4
    [5] => 3
    [6] => 2
    [7] => 1
)
*/

本文首发于公众号:programmer_cc,转载请注明出处。


微信公众号.jpg
上一篇 下一篇

猜你喜欢

热点阅读