簡單排序算法

<?php
$arr = array(
    12,
    45,
    89,
    3,
    24,
    55,
    223,
    76,
    22,
    11,
    28,
    112,
    20,
    434,
    23,
    65,
    65,
    765,
    6,
    8,
    23,
    5,
    33,
    553,
    45,
    423,
    64,
    77,
    84,
    23
);

/**
 * 冒泡排序算法,時間複雜度n²/2次
 * 冒泡排 序的基本概念是:依次比較相鄰的兩個數,將小數放在前面,大數放在後面。即在第一趟:首先比較第1個和第2個數,將小數放前,大數放後。
 * 然後比較第2個數和第3個數,將小數放前,大數放後,如此繼續,直至比較最後兩個數,將小數放前,大數放後。至此第一趟結束,將最大的數放到了最 後。
 * 在第二趟:仍從第一對數開始比較(因爲可能由於第2個數和第3個數的交換,使得第1個數不再小於第2個數),將小數放前,大數放後,一直比較到倒數第 二個數
 * (倒數第一的位置上已經是最大的),第二趟結束,在倒數第二的位置上得到一個新的最大數(其實在整個數列中是第二大的數)。如此下去,重複以上過 程,
 * 直至最終完成排序。
 */
function maopao_sort($arr)
{
    $count = count($arr);
    $tmp;
    $m = 0; // 用於計算執行多少次
    for ($i = 0; $i < $count - 1; $i ++) {
        for ($j = 0; $j < $count - 1 - $i; $j ++) {
            if ($arr[$j] > $arr[$j + 1]) {
                $tmp = $arr[$j];
                $arr[$j] = $arr[$j + 1];
                $arr[$j + 1] = $tmp;
            }
            $m ++;
        }
    }
    print_r($arr);
    echo $m;
}

/**
 * 選擇排序算法,時間複雜度n²/2次
 * 1.從待排序序列中,找到關鍵字最小的元素;
 * 2.如果最小元素不是待排序序列的第一個元素,將其和第一個元素互換;
 * 3.從餘下的 N - 1 個元素中,找出關鍵字最小的元素,重複( 1 )、( 2 )步,直到排序結束
 */
function select_sort($arr)
{
    $count = count($arr);
    $tmp;
    $m = 0; // 用於計算執行多少次
    for ($i = 0; $i < $count - 1; $i ++) {
        $p = $i;
        for ($j = $i + 1; $j < $count; $j ++) {
            if ($arr[$p] > $arr[$j]) {
                $p = $j;
            }
            $m ++;
        }
        if ($p != $i) {
            $tmp = $arr[$p];
            $arr[$p] = $arr[$i];
            $arr[$i] = $tmp;
        }
    }
    print_r($arr);
    echo $m;
}

/**
 * 插入排序算法,時間複雜度n²/2次
 * 插入排序就是每一步都將一個待排數據按其大小插入到已經排序的數據中的適當位置,直到全部插入完畢
 */
function insert_sort($arr)
{
    $count = count($arr);
    $tmp;
    $m = 0; // 用於計算執行多少次
    for ($i = 1; $i < $count; $i ++) {
        $tmp = $arr[$i];
        for ($j = $i - 1; $j >= 0; $j --) {
            if ($tmp < $arr[$j]) {
                $arr[$j + 1] = $arr[$j];
                $arr[$j] = $tmp;
            } else {
                break;
            }
            $m ++;
        }
    }
    print_r($arr);
    echo $m;
}

/**
 * 快速排序算法,時間複雜度n²/2次
 * 該方法的基本思想是:
 * 1.先從數列中取出一個數作爲基準數。
 * 2.分區過程,將比這個數大的數全放到它的右邊,小於或等於它的數全放到它的左邊。
 * 3.再對左右區間重複第二步,直到各區間只有一個數。
 */
function quick_sort($arr)
{
    $count = count($arr);
    if ($count <= 1) {
        return $arr;
    }
    $tmp = $arr[0];
    $left_array = array();
    $right_array = array();
    
    for ($i = 1; $i < $count; $i ++) {
        if ($arr[$i] <= $tmp) {
            $left_array[] = $arr[$i];
        } else {
            $right_array[] = $arr[$i];
        }
        $m ++;
    }
    
    $left_array = quick_sort($left_array);
    $right_array = quick_sort($right_array);
    return array_merge($left_array, array(
        $tmp
    ), $right_array);
}
// print_r(quick_sort($arr));
// // print_r(quickSort($arr));
function quickpaixu($arr)
{
    $count = count($arr);
    if ($count <= 1) {
        return $arr;
    }
    $key = $arr[0]; // 取一個值,稍後用來比較;
    $left_arr = array();
    $right_arr = array();
    for ($i = 1; $i < $count; $i ++) { // 比$key大的放在右邊,小的放在左邊;
        if ($arr[$i] <= $key) {
            $left_arr[] = $arr[$i];
        } else {
            $right_arr[] = $arr[$i];
        }
    }
    $left_arr = quickpaixu($left_arr); // 進行遞歸;
    $right_arr = quickpaixu($right_arr);
    return array_merge($left_arr, array(
        $key
    ), $right_arr); // 將左中右的值合併成一個數組;
} // 以下是測試
  // print_r(quickpaixu($arr));
?>
發佈了48 篇原創文章 · 獲贊 11 · 訪問量 8萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章