您好,欢迎访问一九零五行业门户网

[讨论]php 排序系列的函数内部的C实现是用了哪种排序算法?

ext/standard/php_array.h
https://github.com/php/php-src/blob/master/ext/standard/php_array.h
#ifndef php_array_h#define php_array_hphp_minit_function(array);php_mshutdown_function(array);php_function(ksort);php_function(krsort);php_function(natsort);php_function(natcasesort);php_function(asort);php_function(arsort);php_function(sort);php_function(rsort);php_function(usort);php_function(uasort);php_function(uksort);……
复制代码
上面定义的排序函数:
arsort -- 对数组进行逆向排序并保持索引关系 asort -- 对数组进行排序并保持索引关系 krsort -- 对数组按照键名逆向排序 ksort -- 对数组按照键名排序 natcasesort -- 用“自然排序”算法对数组进行不区分大小写字母的排序 natsort -- 用“自然排序”算法对数组排序 rsort -- 对数组逆向排序sort -- 对数组排序 uasort -- 使用用户自定义的比较函数对数组中的值进行排序并保持索引关联 uksort -- 使用用户自定义的比较函数对数组中的键名进行排序 usort -- 使用用户自定义的比较函数对数组中的值进行排序为了简单,只分析 sort 函数: https://github.com/php/php-src/blob/master/ext/standard/array.c
/* {{{ proto bool sort(array &array_arg [, int sort_flags]) sort an array */php_function(sort){ zval *array; long sort_type = php_sort_regular; if (zend_parse_parameters(zend_num_args() tsrmls_cc, a|l, &array, &sort_type) == failure) { return_false; } php_set_compare_func(sort_type tsrmls_cc); if (zend_hash_sort(z_arrval_p(array), zend_qsort, php_array_data_compare, 1 tsrmls_cc) == failure) { return_false; } return_true;}/* }}} */
复制代码
在代码中,看到了
if (zend_hash_sort(z_arrval_p(array), zend_qsort, php_array_data_compare, ……
使用快速排序的可能性大。
继续分析。
zend/zend_hash.c
https://github.com/php/php-src/blob/master/zend/zend_hash.c
(*sort_func)((void *) artmp, i, sizeof(bucket *), compar tsrmls_cc); handle_block_interruptions(); ht->plisthead = artmp[0]; ht->plisttail = null; ht->pinternalpointer = ht->plisthead; artmp[0]->plistlast = null; if (i > 1) { artmp[0]->plistnext = artmp[1]; for (j = 1; j artmp[j]->plistlast = artmp[j-1]; artmp[j]->plistnext = artmp[j+1]; } artmp[j]->plistlast = artmp[j-1]; artmp[j]->plistnext = null; } else { artmp[0]->plistnext = null; } ht->plisttail = artmp[i-1]; pefree(artmp, ht->persistent); handle_unblock_interruptions(); if (renumber) { p = ht->plisthead; i=0; while (p != null) { p->nkeylength = 0; p->h = i++; p = p->plistnext; } ht->nnextfreeelement = i; zend_hash_rehash(ht); }
复制代码
在算法中,比快速排序还快的,无疑是基数排序,粗略看了一下算法,可能是基础排序中的hash桶排序。
桶排序是稳定的桶排序是常见排序里最快的一种,比快排还要快…大多数情况下桶排序非常快,但是同时也非常耗空间(以空间换时间)
用了, 哪种, php
其它类似信息

推荐信息