PHP 常見4種排序 氣泡排序、選擇排序、插入排序、快速排序

大飛_dafei發表於2018-08-27

1、氣泡排序
原理:對一組資料,比較相鄰數的大小,將值大的放到後面。

<?php
// 氣泡排序
function bubbleOrder($arr)
{
    $count = count($arr);
    $temp = 0;
    // 外層控制排序次數
    for ($i = 0; $i < $count - 1; $i++) {
        // 內層控制每輪比較次數
        for ($j = 0; $j < $count - 1 - $i; $j++) {
            if ($arr[$j] > $arr[$j + 1]) {
                $temp = $arr[$j];
                $arr[$j] = $arr[$j + 1];
                $arr[$j + 1] = $temp;
            }   // print_r($arr);  echo "<br>";
        }
    }
    return $arr;
}

$arr = array(5, 2, 7, 6, 9, 3);
$res = bubbleOrder($arr);
var_dump($res);

2、選擇排序
原理:在一組資料中,選出最小的數與第一個位置交換,
然後在剩下的資料中在找出最小的數和第二個位置交換
然後在剩下的資料中在找出最小的數和第三個位置交換
依次類推直到倒數第二個數和最後一個數對比

<?php
// 選擇排序
function selcetOrder($arr)
{
    // 定義中間變數
    $temp = 0;
    $count = count($arr);
    for ($i = 0; $i < $count - 1; $i++) {
        //定義最小位置
        $minIndex = $i;
        for ($j = $i + 1; $j < $count; $j++) {
            if ($arr[$j] < $arr[$minIndex]) {
                $minIndex = $j;
            }
        }

        if ($i != $minIndex) {
            $temp = $arr[$i];
            $arr[$i] = $arr[$minIndex];
            $arr[$minIndex] = $temp;
        }
    }
    return $arr;
}

$arr = array(5, 2, 7, 6, 9, 3);
$res = selcetOrder($arr);
var_dump($res);

3、插入排序
原理: 將需要排序的書,與前面已經排好的資料從後往前進行比較,使其插入到相應的位置;

<?php
// 插入排序
function insertOrder($arr)
{
    $len = count($arr);
    //控制總迴圈次數
    for ($i = 0; $i < $len; $i++) {
        $temp = $arr[$i];
        for ($j = $i - 1; $j >= 0; $j--) {
            //從當前位置從後往前進行對比
            if ($temp < $arr[$j]) {
                $arr[$j + 1] = $arr[$j];
                $arr[$j] = $temp;
            }else{
                break;
            }
        }
    }
    return $arr;
}
$arr = array(5, 2, 7, 6, 9, 3);
$res = insertOrder($arr);
var_dump($res);

4、快速排序
原理:初始一箇中間值(一般選擇第一個),將需要排序的陣列分成3部分,小於中間的值放左邊、中間值、大於中間值的放右邊,繼續用遞迴用相同的方式來排序左邊和右邊,最後合併陣列

<?php
// 快速排序
function quickOrder($arr)
{
    // 判斷是否需要執行,下面要拿出一箇中間值
    if (count($arr)<=1) {
        return $arr;
    }
    $middle = $arr[0]; // 中間值
    $left   = array();
    $right  = array();
    for ($i = 1; $i < count($arr); $i++) {
        if ($middle < $arr[$i]) {
            $right[] = $arr[$i];
        } else {
            $left[] = $arr[$i];
        }
    }
    // 遞迴排序劃分好的2邊陣列
    $left = quickOrder($left);
    $right = quickOrder($right);
    return array_merge($left, array($middle), $right);
}
$arr = array(5, 2, 7, 6, 9, 3);
$res = quickOrder($arr);
var_dump($res);

 

相關文章