PHP排序函数sort底层实现分析

线性表(即线性数据结构,如数组和链表)的常规排序算法,包括冒泡、插入、选择、归并和快排,其中综合性能最好的就是快排(快速排序),所以快排在工程实践中也有大量的应用,比如很多编程语言都提供了排序函数,而这些排序函数基本都是基于快速排序实现的,比如 PHP 的数组排序函数 sort 就是如此。

今天我们将以此函数的底层实现为例,为大家展示如何基于快速排序来实现 PHP 的 sort 函数(准确的说,是综合运用了插入排序和快速排序)。

PHP 数组排序函数 sort 底层实现分析

首先我们来给大家介绍下 sort 函数,该函数的函数签名是这样的:

bool sort ( array &$array [, int $sort_flags = SORT_REGULAR ] )

我们在调用该函数时,需要传递一个数组作为第一个参数,并且该参数是一个引用参数,不需要设置返回值,排序结果直接作用在数组本身上。该函数默认对数组内数据进行升序排序,支持对数字和字符串进行排序,更多细节可以参考官方文档:https://secure.php.net/manual/zh/function.sort.php。

由于 sort 函数的实现隐藏在 PHP 底层核心代码中,所以首先我们要把 PHP 源码下载到本地,PHP 底层源码已经开源到 GitHub 上:php/php-src,你可以自行将其下载到本地以方便查看,PHP 源码基于 C 语言编写,所以你需要一个支持 C/C++ 语言解析的编辑器来查看 PHP 源码,比如 Visual Studio Code、Visual C++、CLion 等。

PHP 源码中 sort 函数定义位于头文件 ext/standard/php_array.h 中(其实数组相关函数都定义在这里)

真正的函数实现则位于源码 ext/standard/array.c 中:

下面我就来分析这段源码的具体实现:

先对传入参数进行必要的检验和转换;

再通过 php_get_data_compare_func 设置比较函数(想想 PHP 某些数组排序函数支持自定义排序函数,其实所有排序函数的实现原理都是一样的,只不过这里指定了一个默认实现);

最后通过 zend_hash_sort 进行排序操作。

如果你对 C 语言不熟,还看不懂具体的代码实现,没关系,你只需要知道这个大致的流程就好了,我们重点关注最核心的步骤 zend_hash_sort 的内部实现。

我们追溯 zend_hash_sort 函数的定义,可以看到该函数定义在 Zend/zend_hash.h 头文件中:

#define zend_hash_sort(ht, compare_func, renumber) 	zend_hash_sort_ex(ht, zend_sort, compare_func, renumber)

这是一个宏定义,你可以将其看作一个别名,当调用 zend_hash_sort(ht, compare_func, renumber) 时实际调用的是 zend_hash_sort_ex(ht, zend_sort, compare_func, renumber) 函数,这里我们可以看到两个函数对比后者新增了一个参数 zend_sort,该参数是一个函数指针,指向了真正的排序实现函数,位于 Zend/zend_sort.c 中的 zend_sort 函数:

查看 zend_sort 函数的源码,可以看到当数据量较小时(小于等于16),会使用插入排序,因为此时插入排序性能更好;否则会使用快速排序。

感兴趣的同学,可以以此为例查看其他数组排序函数的底层实现,如 asort、ksort、usort 等。

原文地址:https://www.cnblogs.com/stringarray/p/12708276.html

时间: 2024-11-08 02:25:24

PHP排序函数sort底层实现分析的相关文章

算法学习 - STL的p排序函数(sort)使用

排序函数sort() 这个函数是STL自带的,功能很强大~ 这里教下使用方法. sort()有三个参数,第一个是排序的起始位置,第二个是排序的结束位置,第三个是排序的判断函数.函数原型为: sort(<#_RandomAccessIterator __first#>, <#_RandomAccessIterator __last#>, <#_Compare __comp#>) 这个就是原型了~ 使用方法 首先假设我们有一个vector<int> vec;向量

C++ 排序函数 sort(),qsort()的使用方法

想起来自己天天排序排序,冒泡啊,二分查找啊,结果在STL中就自带了排序函数sort,qsort,总算把自己解脱了~ 所以自己总结了一下,首先看sort函数见下表: 函数名 功能描写叙述 sort 对给定区间全部元素进行排序 stable_sort 对给定区间全部元素进行稳定排序 partial_sort 对给定区间全部元素部分排序 partial_sort_copy 对给定区间复制并排序 nth_element 找出给定区间的某个位置相应的元素 is_sorted 推断一个区间是否已经排好序 p

排序函数sort用法简介

排序算法有很多,冒泡排序,选择排序,堆排序,快速排序,归并排序,基数排序-- 其中平均复杂度O(nlogn)的排序算法或者在某方面有特殊优势的算法在ACM中才有实际使用价值,所以上述提到的前2种大家以后就不要用了.其他排序算法大家会慢慢接触,本文主要介绍使用最多的排序函数 sort.大家可能会遇到qsort,qsort比较复杂,逐渐淡出ACMer的视线,所以不用管它. sort函数是C++标准库函数,需要包含头文件 #include <algorithm> 并声明命名空间 using name

C++ 排序函数 sort(),qsort()的用法

转自:http://blog.csdn.net/zzzmmmkkk/article/details/4266888/ 所以自己总结了一下,首先看sort函数见下表: 函数名 功能描述 sort 对给定区间所有元素进行排序 stable_sort 对给定区间所有元素进行稳定排序 partial_sort 对给定区间所有元素部分排序 partial_sort_copy 对给定区间复制并排序 nth_element 找出给定区间的某个位置对应的元素 is_sorted 判断一个区间是否已经排好序 pa

Python3:排序函数sort() 和 sorted() 之介绍

今天来讲一下Python中的排序函数.Python中有2个内建的排序函数,分别为sort() 和 sorted() 下面介绍分别介绍一下2个函数: 1.有一个列表 :a=[1,4,5,88,0,7],想要实现排序功能,可以使用sort() 和 sorted(): a.sort() #默认升序排列 print(a) 输出:[0, 1, 4, 5, 7, 88] a.sort(reverse=True) #reverse=True,降序排列.默认FALSE:升序: print(a) 输出:[88,

PHP中的排序函数sort、asort、rsort、krsort、ksort区别分析

在php中自带了大量了数组排序函数,下面我们一一来介绍一下关于php数组排序的用法吧. sort() 函数用于对数组单元从低到高进行排序. rsort() 函数用于对数组单元从高到低进行排序. asort() 函数用于对数组单元从低到高进行排序并保持索引关系. arsort() 函数用于对数组单元从高到低进行排序并保持索引关系. ksort() 函数用于对数组单元按照键名从低到高进行排序. krsort() 函数用于对数组单元按照键名从高到低进行排序. sort() PHP sort() 函数用

PHP中的排序函数sort、asort、rsort、krsort、ksort区别分析(转)

sort() 函数用于对数组单元从低到高进行排序. rsort() 函数用于对数组单元从高到低进行排序. asort() 函数用于对数组单元从低到高进行排序并保持索引关系. arsort() 函数用于对数组单元从高到低进行排序并保持索引关系. ksort() 函数用于对数组单元按照键名从低到高进行排序. krsort() 函数用于对数组单元按照键名从高到低进行排序. sort() PHP sort() 函数用于对数组单元从低到高进行排序,如果成功则返回 TRUE,失败则返回 FALSE. 注意:

(C++)STL排序函数sort和qsort的用法与区别

主要内容: 1.qsort的用法 2.sort的用法 3.qsort和sort的区别 qsort的用法: 原 型: void qsort(void *base, int nelem, int width, int (*fcmp)(const void *,const void *)); 功 能: 使用快速排序例程进行排序 参 数: 1 待排序数组首地址 2 数组中待排序元素数量 3 各元素的占用空间大小 4 指向函数的指针,用于确定排序的顺序 说 明:qsort函数是ANSI C标准中提供的,其

C++ 排序函数 sort(),qsort()的含义与用法 ,字符串string 的逆序排序等

上学时我们很多学了很多种排序算法,不过在c++stl中也封装了sort等函数,头文件是#include <algorithm> 函数名 功能描述 sort 对给定区间所有元素进行排序 stable_sort 对给定区间所有元素进行稳定排序 partial_sort 对给定区间所有元素部分排序 partial_sort_copy 对给定区间复制并排序 nth_element 找出给定区间的某个位置对应的元素 is_sorted 判断一个区间是否已经排好序 partition 使得符合某个条件的元