PHP 各种排序算法实现代码

下面我将详细讲解“PHP 各种排序算法实现代码”的完整攻略。

简介

排序算法是计算机科学最常用的算法之一,它可以将一组数据按照特定的排序规则进行排序。在实际的开发中,我们经常需要对数据进行排序,比如搜索引擎对搜索结果页的排序,电商网站对商品列表页的排序等。

目前常见的排序算法有插入排序、选择排序、希尔排序、归并排序、快速排序、堆排序等。下面我们将会分别介绍这些排序算法以及它们的 PHP 实现。

1. 插入排序

插入排序的思想是将一个待排序的元素,插入到已经排好序的子序列中,使插入后仍保持有序状态。具体实现可以参考以下代码:

function insertionSort($arr) {
    $len = count($arr);
    for ($i = 1; $i < $len; $i++) {
        $temp = $arr[$i]; // 待排序的元素
        $j = $i - 1; // 已排序序列的最后一个元素的下标
        while ($j >= 0 && $arr[$j] > $temp) {
            // 将大于待排序元素的元素向后移动
            $arr[$j + 1] = $arr[$j];
            $j--;
        }
        // 待排序元素插入到正确的位置
        $arr[$j + 1] = $temp;
    }
    return $arr;
}

示例:

$arr = [5, 2, 4, 6, 1, 3];
echo implode(', ', insertionSort($arr)); // 1, 2, 3, 4, 5, 6

2. 选择排序

选择排序的思想是每次从待排序的元素中选出最小(或最大)的元素,放入已排序序列的最后面。具体实现可以参考以下代码:

function selectionSort($arr) {
    $len = count($arr);
    for ($i = 0; $i < $len - 1; $i++) {
        $minIndex = $i; // 最小元素的下标
        for ($j = $i + 1; $j < $len; $j++) {
            if ($arr[$j] < $arr[$minIndex]) {
                $minIndex = $j;
            }
        }
        // 将最小元素交换到已排序序列的末尾
        list($arr[$i], $arr[$minIndex]) = [$arr[$minIndex], $arr[$i]];
    }
    return $arr;
}

示例:

$arr = [5, 2, 4, 6, 1, 3];
echo implode(', ', selectionSort($arr)); // 1, 2, 3, 4, 5, 6

3. 希尔排序

希尔排序是插入排序的变种,它先将待排序序列分成若干子序列,对每个子序列进行插入排序,然后再对整个序列进行一次插入排序。具体实现可以参考以下代码:

function shellSort($arr) {
    $len = count($arr);
    $gap = $len;
    while ($gap > 1) {
        $gap = intval($gap / 2);
        for ($i = $gap; $i < $len; $i++) {
            $temp = $arr[$i];
            $j = $i - $gap;
            while ($j >= 0 && $arr[$j] > $temp) {
                $arr[$j + $gap] = $arr[$j];
                $j -= $gap;
            }
            $arr[$j + $gap] = $temp;
        }
    }
    return $arr;
}

示例:

$arr = [5, 2, 4, 6, 1, 3];
echo implode(', ', shellSort($arr)); // 1, 2, 3, 4, 5, 6

4. 归并排序

归并排序的思路是将待排序序列分成若干个子序列,对子序列进行递归地排序,然后再将排序后的子序列合并成有序序列。具体实现可以参考以下代码:

function mergeSort($arr) {
    $len = count($arr);
    if ($len <= 1) {
        return $arr;
    }
    $midIndex = intval($len / 2);
    $leftArr = array_slice($arr, 0, $midIndex);
    $rightArr = array_slice($arr, $midIndex);
    $leftArr = mergeSort($leftArr);
    $rightArr = mergeSort($rightArr);
    return merge($leftArr, $rightArr);
}

function merge($arr1, $arr2) {
    $i = $j = 0;
    $result = [];
    while ($i < count($arr1) && $j < count($arr2)) {
        if ($arr1[$i] < $arr2[$j]) {
            $result[] = $arr1[$i];
            $i++;
        } else {
            $result[] = $arr2[$j];
            $j++;
        }
    }
    while ($i < count($arr1)) {
        $result[] = $arr1[$i];
        $i++;
    }
    while ($j < count($arr2)) {
        $result[] = $arr2[$j];
        $j++;
    }
    return $result;
}

示例:

$arr = [5, 2, 4, 6, 1, 3];
echo implode(', ', mergeSort($arr)); // 1, 2, 3, 4, 5, 6

5. 快速排序

快速排序的思路是选择一个基准元素,将比它小的元素放在它的左侧,将比它大的元素放在它的右侧,然后对左右两侧的元素进行递归排序。具体实现可以参考以下代码:

function quickSort($arr) {
    $len = count($arr);
    if ($len < 2) {
        return $arr;
    }
    $leftArr = $rightArr = [];
    $pivotIndex = intval($len / 2);
    $pivot = $arr[$pivotIndex];
    unset($arr[$pivotIndex]);
    foreach ($arr as $value) {
        if ($value < $pivot) {
            $leftArr[] = $value;
        } else {
            $rightArr[] = $value;
        }
    }
    return array_merge(quickSort($leftArr), [$pivot], quickSort($rightArr));
}

示例:

$arr = [5, 2, 4, 6, 1, 3];
echo implode(', ', quickSort($arr)); // 1, 2, 3, 4, 5, 6

6. 堆排序

堆排序使用了堆这种数据结构,它的思路是将待排序序列建成一个堆,然后将堆的根节点(最大或最小值)与最后一个节点交换,并把堆大小减一,并重新调整堆,重复这个过程直到堆大小为1。具体实现可以参考以下代码:

function heapSort(&$arr) {
    $len = count($arr);
    // 构建最大堆
    buildMaxHeap($arr);
    for ($i = $len - 1; $i > 0; $i--) {
        // 最大值(堆的根节点)与最后一个节点交换
        list($arr[0], $arr[$i]) = [$arr[$i], $arr[0]];
        // 调整堆
        adjustHeap($arr, 0, $i);
    }
    return $arr;
}

function buildMaxHeap(&$arr) {
    $len = count($arr);
    for ($i = intval($len / 2) - 1; $i >= 0; $i--) {
        adjustHeap($arr, $i, $len);
    }
}

function adjustHeap(&$arr, $i, $len) {
    $childIndex = $i * 2 + 1;
    $temp = $arr[$i];
    while ($childIndex < $len) {
        if ($childIndex + 1 < $len && $arr[$childIndex + 1] > $arr[$childIndex]) {
            $childIndex++;
        }
        if ($arr[$childIndex] > $temp) {
            $arr[$i] = $arr[$childIndex];
            $i = $childIndex;
            $childIndex = $i * 2 + 1;
        } else {
            break;
        }
    }
    $arr[$i] = $temp;
}

示例:

$arr = [5, 2, 4, 6, 1, 3];
echo implode(', ', heapSort($arr)); // 1, 2, 3, 4, 5, 6

以上就是对常见排序算法的 PHP 实现的详细讲解了。希望对您有所帮助!

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:PHP 各种排序算法实现代码 - Python技术站

(0)
上一篇 2023年5月19日
下一篇 2023年5月19日

相关文章

  • 深入解析桶排序算法及Node.js上JavaScript的代码实现

    深入解析桶排序算法及Node.js上JavaScript的代码实现 桶排序算法介绍 桶排序算法是一种非常有效的排序方法,通常用于在已知数据范围的情况下对数据进行排序。桶排序将数据分配到一个或多个桶中,然后对每个桶中的数据进行排序,最后将所有桶中的数据依次合并即可得到有序的结果。 桶排序的时间复杂度为O(n),其中n为待排序的数据个数。如果数据范围较大,需要分…

    算法与数据结构 2023年5月19日
    00
  • 修复IE9&safari 的sort方法

    修复IE9和Safari的sort()方法需要遵循以下步骤: 1. 检查代码 要修复排序方法,首先需要检查代码,找出可能存在的问题。请确保你的代码中使用的是正确的sort()方法,并且没有拼写错误和语法问题。同时,还要检查你的代码能否适用于所有浏览器。 2. 自定义排序方法 当浏览器不支持sort()方法时,我们可以自定义一个排序方法来替代它。我们可以使用J…

    算法与数据结构 2023年5月19日
    00
  • Python中利用sorted()函数排序的简单教程

    下面是我为您准备的Python中利用sorted()函数排序的简单教程。 1. sorted()函数的简介 sorted()函数是Python内置函数之一,用于对一个可迭代对象进行排序操作。这个函数返回一个新的列表,而不会修改原来的列表本身。 sorted()函数的基本语法如下所示: sorted(iterable, key=None, reverse=Fa…

    算法与数据结构 2023年5月19日
    00
  • PHP快速排序算法实现的原理及代码详解

    下面我就详细讲解一下“PHP快速排序算法实现的原理及代码详解”的完整攻略。 一、快速排序算法的原理 快速排序(Quicksort)是非常常用的排序算法,其基本思想是通过一趟排序将待排记录分隔成独立的两部分,其中一部分记录的关键字均比另一部分的记录关键字小,然后分别对这两部分记录继续进行排序,重复上述过程,直到整个序列有序为止。 具体流程如下: 从数列中挑出一…

    算法与数据结构 2023年5月19日
    00
  • C语言实现文件内容按行随机排列的算法示例

    下面我将为您详细介绍“C语言实现文件内容按行随机排列的算法示例”的完整攻略。 1、问题描述 首先,这个算法的问题描述是:实现一个按行随机排列文件内容的算法,要求结果能够尽可能地随机、均匀。 2、算法思路 针对这个问题,我们可以采用以下算法思路: 首先读取文件的全部内容,将其中的每一行存在一个字符串数组中; 然后采用洗牌算法(shuffle algorithm…

    算法与数据结构 2023年5月19日
    00
  • GO语言中常见的排序算法使用示例

    首先感谢你对“GO语言中常见的排序算法使用示例”的关注,下面是一个完整的攻略: GO语言中常见的排序算法 在GO语言中,常见的排序算法包括:冒泡排序、插入排序、选择排序、希尔排序、归并排序、快速排序、堆排序等。这些排序算法的具体实现方式有所不同,但都可以在GO语言的标准库中找到相应的方法。 冒泡排序 冒泡排序的基本思路是比较相邻的两个元素,如果它们的顺序错误…

    算法与数据结构 2023年5月19日
    00
  • C语言深入探究直接插入排序与希尔排序使用案例讲解

    C语言深入探究直接插入排序与希尔排序使用案例讲解 直接插入排序 算法描述 直接插入排序的基本思想是将一个记录插入到已经排序好的有序表中,从而得到一个新的、记录数增加1的有序表。具体算法流程如下: 从第一个元素开始,该元素可以认为已经被排序 取出下一个元素,在已经排序的元素序列中从后向前扫描 如果该元素大于新元素,将该元素移到下一位置 重复步骤3,直到找到已排…

    算法与数据结构 2023年5月19日
    00
  • java实现图形卡片排序游戏

    以下是“Java实现图形卡片排序游戏”的完整攻略。这个游戏的目标是将打乱的卡片,按顺序排好。具体的操作方法是通过拖拽卡片,让卡片位置移动进行排序。 技术栈 Java语言 Swing GUI库 排序算法 功能设计 加载卡片图片及绑定事件处理方法 卡片随机化处理 拖拽移动卡片 实现移动时的动画效果 判断拼图是否按顺序排好 记录游戏步骤、分数等信息 具体实现 加载…

    算法与数据结构 2023年5月19日
    00
合作推广
合作推广
分享本页
返回顶部