php關聯陣列排序(快速排序)

來源:互聯網
上載者:User
起因

好吧,我承認最近我跟快速排序幹上了,各種測試編寫快速排序程式,現在就用php實現快速排序,跟之前文章不同,這次php的快排是能解決實際需要的.下面的文章裡我會用c語言的思想提出兩種php快速排序的解決方案:

  1. 自己實現快速排序,用分治和歸併的思想
  2. 調用系統的usort,類似於c的qsort,感謝dickeylth的提醒

使用環境和條件有這樣一種情況,php裡面的關聯陣列,如果下面這樣的數組資料:
$array = array (array ('name' => "xiao",'age' => 3 ),array ('name' => 'wang','age' => 1 ),array ('name' => 'chen','age' => 2 ) );

我們要對數組針對age欄位進行排序,php內建的簡單sort功能函數,顯然都不能滿足我們的需求,因此我們可以自己寫一個快速排序代碼,很快的實現我們的要求注意情況php裡面是沒有指標存在的,所以當想要引用傳遞的時候,我們不能跟C代碼一樣,直接這樣寫quicksort(int *A, int begin, int end),而是要使用php的&運算子,將數組的地址傳遞跟快速排序函數,這樣就能在php裡實現引用傳遞而不是值傳遞快速排序代碼分治+歸併實現快排

/** * Description:擷取中樞點的位置 * * @param array $array             * @param int $left             * @param int $right             * @param string $field             * @return int */function fetchArrayPivot (&$array, $left, $right, $field){    // 基準定義    $stand = $array[$left];        // 遍曆數組    while ($left < $right) {        while ($left < $right && $array[$right][$field] >= $stand[$field]) {            $right --;        }        if ($left < $right) {            $array[$left ++] = $array[$right];        }                while ($left < $right && $array[$left][$field] <= $stand[$field]) {            $left ++;        }        if ($left < $right) {            $array[$right --] = $array[$left];        }    }        // 擷取中樞點位置    $array[$left] = $stand;        return $left;}/** * Description:快速排序主程式 * * @param array $array             * @param int $begin             * @param int $end             * @param string $field             */function quickSort (&$array, $begin, $end, $field){    // 變數定義    $pivot = null;        if ($begin < $end) {        $pivot = fetchArrayPivot($array, $begin, $end, $field);        quickSort($array, $begin, $pivot - 1, $field);        quickSort($array, $pivot + 1, $end, $field);    }}

調用樣本

<?php$array = array(        array(                'name' => "xiao",                'age' => 3        ),        array(                'name' => 'wang',                'age' => 1        ),        array(                'name' => 'chen',                'age' => 2        ),        array(                'name' => 'zhengyi',                'age' => 4        ),        array(                'name' => 'chai',                'age' => 14        ));$begin = getTime();quickSort($array, 0, count($array) - 1, 'age');print_r($array);$end = getTime();$spend = $end - $begin;echo "花費時間為:".$spend."秒\n";function getTime(){    list($msec, $sec) = explode(" ", microtime());    return (float)$msec + (float)$sec;}

實現效果調用系統的usort類似c裡面調用qsort,需要自己寫比較函數,跟c類似

/** * Description:類似於c中qsort的比較函數 *  * @param array $a             * @param array $b             * @param string $field             * @return int */function compare ($a, $b){    return $a['age'] - $b['age'];}usort($array, "compare");

調用樣本

<?php$array = array(        array(                'name' => "xiao",                'age' => 3        ),        array(                'name' => 'wang',                'age' => 1        ),        array(                'name' => 'chen',                'age' => 2        ),        array(                'name' => 'zhengyi',                'age' => 4        ),        array(                'name' => 'chai',                'age' => 14        ));$begin = getTime();usort($array, "compare");print_r($array);$end = getTime();$spend = $end - $begin;echo "花費時間為:" . $spend . "秒\n";function getTime (){    list ($msec, $sec) = explode(" ", microtime());    return (float) $msec + (float) $sec;}

實現效果

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.