劍指offer-轉陣列的最小數字-php

Ginger_CJ發表於2018-05-10

原題截圖

劍指offer-轉陣列的最小數字-php
很典型的排序問題,那麼就通過這道題複習一下排序演算法。

1、PHP內建排序函式解決此問題

if(empty($rotateArray)) return 0;
return min($rotateArray);
//sort($rotateArray);
//return $rotateArray[0];
複製程式碼

最直接且最簡單的實現方式。

當然我們本文不只為了解決這個問題,那麼我們來介紹一下其它的且比較典型的排序演算法。

1、氣泡排序

思路分析:在要排序的一組數中,對當前還未排好的序列,從前往後對相鄰的兩個數依次進行比較和調整,讓較大的數往下沉,較小的往上冒。即,每當兩相鄰的數比較後發現它們的排序與排序要求相反時,就將它們互換。

劍指offer-轉陣列的最小數字-php

function bubbleSort($arr)
{
    $len = count($arr);
    for ($i = 1; $i < $len; $i++) {
        for ($k = 0; $k < $len - $i; $k++) {
            if ($arr[$k] > $arr[$k + 1]) {
                $tmp = $arr[$k + 1];
                $arr[$k + 1] = $arr[$k];
                $arr[$k] = $tmp;
            }
        }
    }
    return $arr;
}
複製程式碼

此排序方式不太試用於解決上題

2、選擇排序

思路分析:在要排序的一組數中,選出最小的一個數與第一個位置的數交換。然後在剩下的數當中再找最小的與第二個位置的數交換,如此迴圈到倒數第二個數和最後一個數比較為止。

劍指offer-轉陣列的最小數字-php

function selectSort($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[$p];
            $arr[$p] = $arr[$i];
            $arr[$i] = $tmp;
        }
    }
    return $arr;
}
複製程式碼

3、插入排序

思路分析:在要排序的一組數中,假設前面的數已經是排好順序的,現在要把第n個數插到前面的有序數中,使得這n個數也是排好順序的。如此反覆迴圈,直到全部排好順序。

劍指offer-轉陣列的最小數字-php

function insertSort($arr)
{
    $len = count($arr);
    for ($i = 1; $i < $len; $i++) {
        $tmp = $arr[$i];
        for ($j = $i - 1; $j >= 0; $j--) {
            if ($tmp >= $arr[$j]) break;
            $arr[$j + 1] = $arr[$j];
            $arr[$j] = $tmp;
        }
    }
    return $arr;
}
複製程式碼

4、快速排序

思路分析:選擇一個基準元素,通常選擇第一個元素或者最後一個元素。通過一趟掃描,將待排序列分成兩部分,一部分比基準元素小,一部分大於等於基準元素。此時基準元素在其排好序後的正確位置,然後再用同樣的方法遞迴地排序劃分的兩部分。

劍指offer-轉陣列的最小數字-php

function quickSort($arr)
{
    $len = count($arr);
    if ($len <= 1) return $arr;
    $leftArr = $rightArr = [];
    $item = $arr[0];
    for ($i = 1; $i < $len; $i++) {
        if ($item > $arr[$i])
            $leftArr[] = $arr[$i];
        else
            $rightArr[] = $arr[$i];
    }
    return array_merge(quickSort($leftArr), [$item], quickSort($rightArr));
}
複製程式碼

以上4種排序方法是比較常見的,其它的排序演算法有時間繼續更新。

相關文章