ホームページ  >  記事  >  バックエンド開発  >  関数を使用せずにPHPで配列をソートする方法

関数を使用せずにPHPで配列をソートする方法

PHPz
PHPzオリジナル
2023-04-27 09:03:10643ブラウズ

PHP は、配列の並べ替えを容易にする多くの強力な関数を備えた、広く使用されているプログラミング言語です。ただし、場合によっては、関数を使用せずに配列を並べ替える必要がある場合があります。この記事では、関数を使用せずに PHP で配列を並べ替える方法について説明します。

1. バブルソート法

バブルソートは、隣接する要素を比較し、順序が間違っていれば入れ替えるというシンプルなソートアルゴリズムです。長さ n の配列に対して、最大で n-1 ラウンドの比較および交換操作が実行され、各ラウンドの後、順序なし領域の末尾要素が順序付き領域の先頭要素になります。

以下は、例として昇順を使用して PHP を使用してバブル ソートを実装するコードです:

function bubbleSort(&$arr){
    $len = count($arr); //获取数组长度
    for($i=0;$i<$len-1;$i++){ //需要比较n-1轮
        for($j=0;$j<$len-$i-1;$j++){ //每一轮需要比较n-i-1次
            if($arr[$j]>$arr[$j+1]){ //如果前一个元素大于后一个元素,交换位置
                $tmp = $arr[$j+1];
                $arr[$j+1] = $arr[$j];
                $arr[$j] = $tmp;
            }
        }
    }
}

上記のコードの時間計算量は O(n^2) であり、これは最適なソートアルゴリズムです。ただし、場合によっては、バブル ソートのコード実装が比較的単純で、小さな配列のソートに使用できることがあります。

2. 選択ソート方法

選択ソートは単純なソートアルゴリズムであり、その基本的な動作は、ソート対象のシーケンスから最小 (または最大) の要素を選択し、それをソート済みのリストに入れることです。シーケンス、シーケンスの終わり。長さ n の配列の場合、n-1 回の比較および交換操作が必要であり、各ラウンドの比較の後、順序なし領域の先頭要素が順序付き領域の末尾要素になります。

以下は、昇順を例として、PHP を使用して選択ソートを実装するコードです:

function selectSort(&$arr){
    $len = count($arr);//获取数组长度
    for($i=0;$i<$len-1;$i++){//需要比较n-1轮
        $minIndex=$i;//用来存储最小元素的下标
        for($j=$i+1;$j<$len;$j++){
            if($arr[$j]<$arr[$minIndex]){//如果有小于当前最小值的元素,更新minIndex
                $minIndex=$j;
            }
        }
        //将最小元素和无序区域的头部元素交换位置
        $tmp = $arr[$minIndex];
        $arr[$minIndex] = $arr[$i];
        $arr[$i] = $tmp;
    }
}

上記のコードの時間計算量は O(n^2) ですが、そうではありません。最適な並べ替えアルゴリズム。ただし、選択ソート方法は実装が簡単で理解しやすく、小さな配列のソートにも使用できます。

3. 挿入ソート方法

挿入ソートは単純なソート アルゴリズムであり、その基本的な操作は、既にソート済みの順序付けされたシーケンスにデータを挿入することです。長さ n の配列の場合、n-1 回の比較および移動操作が必要であり、各ラウンドの比較の後、順序なし領域の先頭要素が順序付き領域の末尾要素になります。

以下は、昇順を例として、PHP を使用して挿入ソートを実装するコードです。

function insertSort(&$arr){
    $len = count($arr);//获取数组长度
    for($i=1;$i<$len;$i++){//需要将n-1个元素插入到有序区域
        $tmp = $arr[$i];//用一个临时变量存储待插入的元素
        for($j=$i-1;$j>=0;$j--){//将tmp插入到合适的位置
            if($tmp<$arr[$j]){
                $arr[$j+1]=$arr[$j];//将大于tmp的元素向后移动一位
            }else{
                break;//找到了合适的位置,退出循环
            }
        }
        $arr[$j+1]=$tmp;//将tmp插入到合适的位置
    }
}

上記のコードの時間計算量は O(n^2) ですが、これは O(n^2) です。最適なアルゴリズム。ただし、挿入ソート方法は実装が簡単で、小さな配列や部分的に順序付けされた配列のソートに使用できます。

4. クイック ソート方法

クイック ソートは効率的なソート アルゴリズムであり、その基本的な考え方は、1 回のソートで配列を 2 つの部分列に分割し、左側の部分列の要素が小さくなるようにすることです。 than 基本要素、右側のサブシーケンスの要素がすべて基本要素より大きい場合、左右のサブシーケンスが再帰的に並べ替えられ、最後に 2 つの順序付けされたサブシーケンスが 1 つの順序付けされたシーケンスにマージされます。クイックソートの時間計算量は O(nlogn) です。

昇順を例に挙げると、PHP を使用してクイック ソートを実装するコードは次のとおりです。

function quickSort(&$arr,$left,$right){
    if($left<$right){
        $i=$left;$j=$right;//选择一个基准元素,初始化左右指针
        $pivot=$arr[$i];//将基准元素存储到临时变量pivot
        while($i<$j){
            while($i<$j && $arr[$j]>=$pivot){//逆序查找比基准元素小的元素
                $j--;
            }
            if($i<$j){
                $arr[$i++]=$arr[$j];
            }
            while($i<$j && $arr[$i]<=$pivot){//顺序查找比基准元素大的元素
                $i++;
            }
            if($i<$j){
                $arr[$j--]=$arr[$i];
            }
        }
        $arr[$i]=$pivot;//将基准元素插入到左右子序列的交界处
        quickSort($arr,$left,$i-1);//对左子序列递归排序
        quickSort($arr,$i+1,$right);//对右子序列递归排序
    }
}

上記のコードの時間計算量は O (nlogn) であり、これはより優れたソートです。アルゴリズム。クイック ソートの実装プロセスはより複雑ですが、そのパフォーマンスは最高であり、さまざまなサイズの配列のソートに使用できます。

要約:

上記では、PHP 関数を使用せずに配列をソートする 4 つの方法 (バブル ソート、選択ソート、挿入ソート、クイック ソート) を紹介しました。実際のアプリケーションでは、配列のサイズと並べ替え要件に基づいて、適切な並べ替えアルゴリズムを選択できます。なお、これらのアルゴリズムはPHPの組み込み関数に依存していませんが、実際に使用する場合には実行時間やメモリ使用量などを考慮する必要があります。

以上が関数を使用せずにPHPで配列をソートする方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。