@
billyzg 寒,看了这道题目顿时虎驱一震。
不是我要不要你们公司,而是你们公司要不要我了……
因为……这道题目我当场肯定回答不出来。我只能对面试我的人说这题目我会“百度知道”。
我确实会借助于百度去查这个问题的……
百度也确实有答案:
---------
php 内置函数用什么排序算法,如 sort 函数等_百度知道
1 个回答 - 提问时间: 2012 年 02 月 27 日
最佳答案: 用的是快速排序
---------
完美解决了啊
啊…………
我手里正好有 PHP 的 souce,还是谨慎点看一下免得被 v2 的高手打脸到时候我脸皮都没地方搁吧。
在 D:\php_source\php-7.1.2-src\php-7.1.2-src\ext\standard 里的 array.c 里找到代码
PHP_FUNCTION(sort)
{
zval *array;
zend_long sort_type = PHP_SORT_REGULAR;
compare_func_t cmp;
if (zend_parse_parameters(ZEND_NUM_ARGS(), "a/|l", &array, &sort_type) == FAILURE) {
RETURN_FALSE;
}
cmp = php_get_data_compare_func(sort_type, 0);
if (zend_hash_sort(Z_ARRVAL_P(array), cmp, 1) == FAILURE) {
RETURN_FALSE;
}
RETURN_TRUE;
}
重点在 zend_hash_sort(Z_ARRVAL_P(array), cmp, 1)
然后在
D:\php_source\php-7.1.2-src\php-7.1.2-src\Zend
中的 zend_hash.h 里找到定义
#define zend_hash_sort(ht, compare_func, renumber) \
zend_hash_sort_ex(ht, zend_sort, compare_func, renumber)
在 zend_hash.c 里找到实现
ZEND_API int ZEND_FASTCALL zend_hash_sort_ex(HashTable *ht, sort_func_t sort, compare_func_t compar, zend_bool renumber)
{
Bucket *p;
uint32_t i, j;
……
}
问题就简单了,因为我看到了 Bucket *p;
接下去的东西就太晚了不想看了。
不过这道题目我确实是当场面肯定答不出来的,我对算法也不是那么熟。如果这是资深 PHP (我更感觉这标准应该是在招一个 C 程序员)标准的话,我大概只能算初级 PHP 了(难怪没有面试)。一般我们公司也不会去改造 PHP 源代码,能用就可以了,我的 PHP 的核心也不是非常了解,都是应用级别,毕竟是万金油。除非真的是性能出了问题,不过那时候先会考虑模块层面的拆分和架构,我第一想法有压力的那部分业务拆分到 Java 上面去了。(到那种数据级别的公司应该不会小气到不用 Java 工程师吧,原谅我。。我是 Java 墙头草……)
不知道你们什么公司……能考虑到这种问题感觉规模应该是蛮大的了吧……如果是这个要求的话,我感觉面试会被调戏啊。。