国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

[討論]php 排序系列的函數(shù)內(nèi)部的C實現(xiàn)是用了哪種排序算法?

chanthuang / 1271人閱讀

摘要:在算法中,比快速排序還快的,無疑是基數(shù)排序,粗略看了一下算法,可能是基礎(chǔ)排序中的桶排序。桶排序是穩(wěn)定的桶排序是常見排序里最快的一種,比快排還要快大多數(shù)情況下桶排序非常快,但是同時也非常耗空間以空間換時間

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_H

PHP_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);
……

上面定義的排序函數(shù):

arsort -- 對數(shù)組進(jìn)行逆向排序并保持索引關(guān)系

asort -- 對數(shù)組進(jìn)行排序并保持索引關(guān)系

krsort -- 對數(shù)組按照鍵名逆向排序

ksort -- 對數(shù)組按照鍵名排序

natcasesort -- 用“自然排序”算法對數(shù)組進(jìn)行不區(qū)分大小寫字母的排序

natsort -- 用“自然排序”算法對數(shù)組排序

rsort -- 對數(shù)組逆向排序

sort -- 對數(shù)組排序

uasort -- 使用用戶自定義的比較函數(shù)對數(shù)組中的值進(jìn)行排序并保持索引關(guān)聯(lián)

uksort -- 使用用戶自定義的比較函數(shù)對數(shù)組中的鍵名進(jìn)行排序

usort -- 使用用戶自定義的比較函數(shù)對數(shù)組中的值進(jìn)行排序

為了簡單,只分析 sort 函數(shù): 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, ……

使用快速排序的可能性大。

繼續(xù)分析。

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 < i-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);
    }

在算法中,比快速排序還快的,無疑是基數(shù)排序,粗略看了一下算法,可能是基礎(chǔ)排序中的hash桶排序

桶排序是穩(wěn)定的

桶排序是常見排序里最快的一種,比快排還要快…大多數(shù)情況下

桶排序非常快,但是同時也非常耗空間(以空間換時間

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/20608.html

相關(guān)文章

  • PHP面試:盡可能多說出你知道排序算法

    摘要:良好的排序算法具有進(jìn)行最少的比較和交換的特征。冒泡排序是一個基于比較的排序算法,被認(rèn)為是效率最低的排序算法之一。現(xiàn)在讓我們使用實現(xiàn)冒泡排序算法。插入排序到目前為止,我們已經(jīng)看到了兩種基于比較的排序算法。 預(yù)警 本文適合對于排序算法不太了解的新手同學(xué)觀看,大佬直接忽略即可。因為考慮到連貫性,所以篇幅較長。老鐵們看完需要大概一個小時,但是從入門到完全理解可能需要10個小時(哈哈哈,以我自己...

    objc94 評論0 收藏0
  • 利用PHP實現(xiàn)常用數(shù)據(jù)結(jié)構(gòu)之排序(小白系列文章七)

    摘要:排序嚴(yán)格來說不算數(shù)據(jù)結(jié)構(gòu),更應(yīng)該歸于算法一類,因為數(shù)據(jù)結(jié)構(gòu)指的是數(shù)據(jù)與數(shù)據(jù)之間的關(guān)系,排序參與其中,更多的是讓數(shù)據(jù)狀態(tài)發(fā)生了改變。 排序嚴(yán)格來說不算數(shù)據(jù)結(jié)構(gòu),更應(yīng)該歸于算法一類,因為數(shù)據(jù)結(jié)構(gòu)指的是數(shù)據(jù)與數(shù)據(jù)之間的關(guān)系,排序參與其中,更多的是讓數(shù)據(jù)狀態(tài)發(fā)生了改變。于是,我們開始用PHP來聊聊算法。 引子 其實有一句話說的是不錯的,不必重復(fù)造輪子,所以下面我將引用別人的文章作為本文的引文,...

    jayzou 評論0 收藏0

發(fā)表評論

0條評論

chanthuang

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<