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日

相关文章

  • MS-office计算机二级选择题大全

    MS-office计算机二级选择题大全攻略 为了帮助读者顺利通过MS-office计算机二级考试,我整理了以下的攻略: 1. 熟悉考试内容 首先要熟悉考试的内容,明确各个模块的考试重点,掌握考试的基本知识点和技巧,不仅能够提高备考效率,也能在考试时更加得心应手。 2. 做足练习 除了熟悉考试内容之外,还需要通过做题来掌握一些技巧和方法。需要多做相关题目和模拟…

    算法与数据结构 2023年5月19日
    00
  • javascript使用递归算法求两个数字组合功能示例

    下面是关于 JavaScript 使用递归算法求两个数字组合的完整攻略: 什么是递归? 递归是一种思想,用来解决一些需要重复执行的问题,比如求一个数的阶乘,求一个斐波那契数列等。通俗的讲,递归就是函数自己调用自己。 递归的使用场景 递归通常用于解决以下两类问题: 包含自相似性质的问题,如分形图形。 对于可被拆分为相同问题的大型问题。 求两个数字组合的递归方案…

    算法与数据结构 2023年5月19日
    00
  • C++实现自顶向下的归并排序算法

    下面是“C++实现自顶向下的归并排序算法”的完整攻略。 归并排序的概念 归并排序是一种分治法排序算法,它将一个大数组分成两个部分,分别对这两个部分进行排序,最后将两个排好序的部分合并起来。归并排序的时间复杂度为O(n log n)。 归并排序的步骤 实现归并排序需要以下三个步骤: 分割 – 将数组分成两个部分,分别对每个部分进行排序。该过程使用二分法来实现。…

    算法与数据结构 2023年5月19日
    00
  • MySQL排序原理和案例详析

    MySQL排序的原理主要包括内部排序和外部排序两种方式。内部排序主要用于处理较小的数据集,而外部排序则专门用于处理大型数据集。 在内部排序中,MySQL主要采用快速排序算法进行排序。快速排序是一种常用的分治算法,其核心思想是通过将一个大问题分解成多个小问题并逐步解决,最终将所有小问题关键字的排序结果合并起来得到整个序列的有序排列。 在外部排序中,MySQL采…

    算法与数据结构 2023年5月19日
    00
  • 2019年京东前端工程师面试题(附答案)

    本次将会以京东前端工程师面试题为例,详细讲解如何准备和应对前端岗面试。 第一步:了解面试整体流程和考察的技能点 在准备面试前,需要先了解面试的整体流程和所考察的技能点,从而根据需要和缺点来进行有针对性的准备。 面试的整体流程一般包括: 自我介绍和岗位广告 聊聊项目和技术栈 问题解答和技术评测 算法/编码能力测试 HR面试 而在前端工程师的岗位面试中,考察的技…

    算法与数据结构 2023年5月19日
    00
  • php实现的常见排序算法汇总

    PHP实现的常见排序算法汇总 本文主要介绍几种PHP实现常见排序算法的方法,帮助读者快速了解和使用这些排序算法。 排序算法是计算机编程领域中非常重要的基础算法之一,可以用于对数据进行排序,常见的排序算法包括冒泡排序、选择排序、插入排序、快速排序等,本文将介绍其中的三种算法。 冒泡排序 冒泡排序是一种简单直观的排序算法,通过比较相邻元素的大小,将较大的元素逐个…

    算法与数据结构 2023年5月19日
    00
  • input标签内容改变的触发事件介绍

    当用户在表单中输入内容时,网页需要对用户输入进行实时的响应,以方便用户进行修改和确认。而input标签就是常用于表单输入的标签之一,它提供了多种类型的输入框,如文本框、单选框、复选框、下拉框等。在这些输入框中,当其中的内容发生改变时,我们需要将其更新到网页中,这时就需要用到“input标签内容改变的触发事件”。 事件是指在特定的时刻发生的动作或行为,而事件处…

    算法与数据结构 2023年5月19日
    00
  • C++递归实现选择排序算法

    实现选择排序算法的递归版本,步骤如下: 步骤1:找到最小值 首先,在要排序的数组中找到最小值,这个过程可以用for循环来实现。具体实现如下: // 找到数组中最小值的下标 int findMinIndex(int arr[], int startIndex, int endIndex) { int minIndex = startIndex; for (in…

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