首頁  >  文章  >  後端開發  >  PHP中如何不用函數為陣列排序

PHP中如何不用函數為陣列排序

PHPz
PHPz原創
2023-04-27 09:03:10643瀏覽

PHP是一種廣泛使用的程式語言,擁有許多強大的函數來方便陣列的排序。然而,在某些情況下,我們可能需要不使用函數對陣列進行排序。在本篇文章中,我們將討論如何在PHP中實作不使用函數對陣列進行排序。

一、冒泡排序法

冒泡排序是一種簡單的排序演算法,它的基本操作是比較相鄰的元素,如果它們的順序錯誤就交換它們。對於一個長度為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),並不是最優的排序演算法。但在某些情況下,冒泡排序的程式碼實作比較簡單,可以用來排序小數組。

二、選擇排序法

選擇排序是一種簡單的排序演算法,它的基本操作是從待排序序列中選擇最小(或最大)的元素放到已排好序序列的末端。對於一個長度為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),也不是最優的排序演算法。但選擇排序法實作簡單,容易理解,可以用來排序小數組。

三、插入排序法

插入排序是一種簡單的排序演算法,它的基本操作是將一個資料插入到已經排序好的有序序列中。對於一個長度為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(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函數對陣列進行排序的方法,它們分別是冒泡排序法、選擇排序法、插入排序法和快速排序法。在實際應用中,我們可以根據數組的大小和排序的要求來選擇合適的排序演算法。需要注意的是,這些演算法雖然不依賴PHP內建的函數,但在實際使用上也需要考慮執行時間和記憶體佔用等方面的問題。

以上是PHP中如何不用函數為陣列排序的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn