亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 語言 > PHP > 正文

PHP排序算法之基數排序(Radix Sort)實例詳解

2024-05-05 00:03:19
字體:
來源:轉載
供稿:網友

本文實例講述了PHP排序算法之基數排序(Radix Sort)。分享給大家供大家參考,具體如下:

基數排序在《大話數據結構》中并未講到,但是為了湊齊八大排序算法,我自己通過網絡學習了這個排序算法,并給大家分享出來。

基本思想:

基數排序(radix sort)屬于“分配式排序”(distribution sort),又稱“桶子法”(bucket sort)或bin sort,顧名思義,它是透過鍵值的部份資訊,將要排序的元素分配至某些“桶”中,藉以達到排序的作用,基數排序法是屬于穩定性的排序,其時間復雜度為O (nlog(r)m),其中r為所采取的基數,而m為堆數,在某些時候,基數排序法的效率高于其它的穩定性排序法。

其實這個思想我也沒法總結出來,下面通過例子來說明吧:

基本解法:

PS:在這里我們介紹的基數排序我們采用 LSD(最低位優先),當然還有 MSD(最高位優先),大家自己去百度一下他們之間的異同吧。

假如現在我們有以下這么一些數:

2 343 342 1 128 43 4249 814 687 654 3

我們使用基數排序將他們從小到大排序。

第一步、首先根據個位數的數值,在走訪數值(從前到后走訪,后面步驟相同)時將它們分配至編號0到9的桶子中:

0 :
1 : 1
2 : 2 342
3 : 343 43 3
4 : 814 654
5 :
6 :
7 : 687
8 : 128
9 : 4249

第二步、接下來將這些桶子中的數值重新串接起來,成為以下的數列:

1 2 342 343 43 3 814 654 687 128 4249

第三步、根據十位數的數值,在走訪數值(從前到后走訪,后面步驟相同)時將它們分配至編號0到9的桶子中:

0 : 1 2 3
1 : 814
2 : 128
3 :
4 : 342 343 43 4249
5 : 654
6 :
7 :
8 : 687
9 :

第四步、接下來將這些桶子中的數值重新串接起來,成為以下的數列:

1 2 3 814 128 342 343 43 4249 654 687

第五步、根據百位數的數值,在走訪數值(從前到后走訪,后面步驟相同)時將它們分配至編號0到9的桶子中:

0 : 1 2 3 43
1 : 128
2 : 4249
3 : 342 343
4 :
5 :
6 : 654 687
7 :
8 : 814
9 :

第六步、接下來將這些桶子中的數值重新串接起來,成為以下的數列:

1 2 3 43 128 4249 342 343 654 687 814

。。。。。。后面的步驟大家應該都會走了吧。其實到了第六步的時候就剩 4249 沒有排好序了。

從上面的步驟來看,很多的步驟都是相同的,因此肯定是個循環了,我們只需要控制個位、十位、百位、、、、就好了。

還是看代碼吧。

算法實現:

//交換函數function swap(array &$arr,$a,$b){  $temp = $arr[$a];  $arr[$a] = $arr[$b];  $arr[$b] = $temp;}//獲取數組中的最大數//就像上面的例子一樣,我們最終是否停止算法不過就是看數組中的最大值:4249,它的位數就是循環的次數function getMax(array $arr){  $max = 0;  $length = count($arr);  for($i = 0;$i < $length;$i ++){    if($max < $arr[$i]){      $max = $arr[$i];    }  }  return $max;}//獲取最大數的位數,最大值的位數就是我們分配桶的次數function getLoopTimes($maxNum){  $count = 1;  $temp = floor($maxNum / 10);  while($temp != 0){    $count ++;    $temp = floor($temp / 10);  }  return $count;}/** * @param array $arr 待排序數組 * @param $loop 第幾次循環標識 * 該函數只是完成某一位(個位或十位)上的桶排序 */function R_Sort(array &$arr,$loop){  //桶數組,在強類型語言中,這個數組應該聲明為[10][count($arr)]  //第一維是 0-9 十個數  //第二維這樣定義是因為有可能待排序的數組中的所有數的某一位上的只是一樣的,這樣就全擠在一個桶里面了  $tempArr = array();  $count = count($arr);  //初始化$tempArr數組  for($i = 0;$i < 10;$i ++){    $tempArr[$i] = array();  }  //求桶的index的除數  //如798個位桶index=(798/1)%10=8  //十位桶index=(798/10)%10=9  //百位桶index=(798/100)%10=7  //$tempNum為上式中的1、10、100  $tempNum = (int)pow(10, $loop - 1);  for($i = 0;$i < $count;$i ++){    //求出某位上的數字    $row_index = ($arr[$i] / $tempNum) % 10;    for($j = 0;$j < $count;$j ++){      if(@$tempArr[$row_index][$j] == NULL){        $tempArr[$row_index][$j] = $arr[$i];   //入桶        break;      }    }  }  //還原回原數組中  $k = 0;  for($i = 0;$i < 10;$i ++){    for($j = 0;$j < $count;$j ++){      if(@$tempArr[$i][$j] != NULL){        $arr[$k ++] = $tempArr[$i][$j];  //出桶        $tempArr[$i][$j] = NULL;  //避免下次循環的時候污染數據      }    }  }}//最終調用的主函數function RadixSort(array &$arr){  $max = getMax($arr);  $loop = getLoopTimes($max);  //對每一位進行桶分配(1 表示個位,$loop 表示最高位)  for($i = 1;$i <= $loop;$i ++){    R_Sort($arr,$i);  }}

調用算法:

$arr = array(2, 343, 342, 1, 128, 43, 4249, 814, 687, 654, 3);RadixSort($arr);var_dump($arr);

運行結果:

array(11) { [0]=> int(1) [1]=> int(2) [2]=> int(3) [3]=> int(43) [4]=> int(128) [5]=> int(342) [6]=> int(343) [7]=> int(654) [8]=> int(687) [9]=> int(814) [10]=> int(4249)}

其實這些代碼我是在挺早之前寫的,今天在寫博客的時候發現,其實桶就是一個隊列,所以上面的 R_Sort()函數復雜了,我們使用 array_push() array_shift() 來重寫該方法(當然,要模擬隊列的話,用 SPL 提供的 splqueue 是最為恰當的,在這里為了簡便我就不用了):

function R_Sort(array &$arr,$loop){  $tempArr = array();  $count = count($arr);  for($i = 0;$i < 10;$i ++){    $tempArr[$i] = array();  }  //求桶的index的除數  //如798個位桶index=(798/1)%10=8  //十位桶index=(798/10)%10=9  //百位桶index=(798/100)%10=7  //$tempNum為上式中的1、10、100  $tempNum = (int)pow(10, $loop - 1);  for($i = 0;$i < $count;$i ++){    //求出某位上的數字    $row_index = ($arr[$i] / $tempNum) % 10;    //入桶    array_push($tempArr[$row_index],$arr[$i]);  }  //還原回原數組中  $k = 0;  for($i = 0;$i < 10;$i ++){    //出桶    while(count($tempArr[$i]) > 0){      $arr[$k ++] = array_shift($tempArr[$i]);    }  }}

基數排序法是屬于穩定性的排序,其時間復雜度為O (nlog(r)m),其中r為所采取的基數,而m為堆數。

好了,到這里基數排序就已經給大家介紹完了。這個算法的總結主要是通過看網上的資料,所以就不再給出原作者了。

希望本文所述對大家PHP程序設計有所幫助。


注:相關教程知識閱讀請移步到PHP教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
久久99精品视频一区97| 日韩av网站大全| 亚洲片av在线| 日韩成人激情在线| 久久99国产综合精品女同| 欧美专区在线播放| 亚洲精品国产福利| 亚洲小视频在线观看| 欧美黄色片视频| 国产91精品网站| 亚洲国产精久久久久久| 日韩激情视频在线播放| 久久人人爽人人| 日本不卡视频在线播放| 中文字幕少妇一区二区三区| 国产综合色香蕉精品| 国产精欧美一区二区三区| 欧美亚洲另类制服自拍| 日韩av高清不卡| 国产精品久久久久久久9999| 国产精品99久久99久久久二8| 国产成人自拍视频在线观看| 日韩精品视频在线| 九九热精品视频| 4438全国亚洲精品在线观看视频| 色偷偷av一区二区三区乱| 久久免费视频网| 欧美疯狂xxxx大交乱88av| 亚洲国产日韩欧美综合久久| 欧美日韩亚洲国产一区| 成人国产精品一区二区| 欧美激情精品在线| 欧美日韩在线视频一区| 亚洲国产精品yw在线观看| 全色精品综合影院| 欧美电影免费观看高清| 国产精品久久久久久av下载红粉| 欧美电影免费在线观看| 亚洲精品国产品国语在线| 亚洲视频在线播放| 欧美日韩在线第一页| 97超碰蝌蚪网人人做人人爽| 91亚洲精品视频| 日韩黄色av网站| 国模吧一区二区三区| 欧美视频专区一二在线观看| 91牛牛免费视频| 亚洲精品一区中文字幕乱码| 懂色av中文一区二区三区天美| 久久久久久999| 欧美成人国产va精品日本一级| 日韩欧美中文字幕在线观看| 久久综合色88| 国产精品视频一区二区高潮| 国产69精品久久久久久| 久久精品91久久久久久再现| 国产精品美女免费| 亚洲欧美制服另类日韩| 91久久久久久| 亚洲第一中文字幕在线观看| 亚洲成人三级在线| 色综合视频一区中文字幕| 国内精品视频一区| 一本色道久久88综合亚洲精品ⅰ| 69久久夜色精品国产7777| 国产这里只有精品| 日韩大片在线观看视频| 欧美不卡视频一区发布| 高跟丝袜一区二区三区| 国产精品福利在线观看| 欧美日韩综合视频| 中文字幕亚洲情99在线| 亚洲精品一区二区三区婷婷月| 中文字幕日韩精品在线| 久久久视频精品| 久久亚洲春色中文字幕| 精品久久久久国产| 日韩高清电影免费观看完整版| 欧美电影免费播放| 91精品国产高清自在线看超| 日韩视频在线观看免费| 午夜精品久久久久久99热| 国产精品香蕉国产| 国产精品日韩在线观看| 一本色道久久88综合亚洲精品ⅰ| 国产精品中文字幕在线观看| 久久精品久久久久电影| 久久久久国产视频| 国产精品啪视频| 亚洲最大的成人网| 国产精品国产自产拍高清av水多| 欧美精品video| 91精品国产色综合久久不卡98口| 怡红院精品视频| 欧美激情中文网| 一区二区三区国产在线观看| 91美女高潮出水| 亚洲一区二区自拍| 2019中文字幕全在线观看| 91精品国产自产91精品| 国产精品无码专区在线观看| 久久精品国产清自在天天线| 欧美日韩国产精品一区| 久久99久久99精品免观看粉嫩| 欧美性猛交xxxx免费看久久久| 欧美怡红院视频一区二区三区| 亚洲一区第一页| 欧美在线影院在线视频| 亚洲人成电影在线观看天堂色| 欧美激情极品视频| 国产视频亚洲精品| 欧美日韩在线视频一区| 亚洲激情小视频| 国产女精品视频网站免费| 国产精品久久久久久久久久久不卡| 日韩欧美999| 国产欧美日韩中文| 成人在线观看视频网站| 一本大道香蕉久在线播放29| 国产精品影院在线观看| 欧美日韩国产在线| 91免费国产视频| 九九热这里只有在线精品视| 亚洲区在线播放| 波霸ol色综合久久| 午夜精品视频在线| 亚洲欧美一区二区三区在线| 国产成人亚洲精品| 欧美日韩国产在线看| 91chinesevideo永久地址| 亚洲va欧美va国产综合剧情| 欧美日韩亚洲国产一区| 国产成一区二区| 欧美国产日韩中文字幕在线| 亚洲人成电影网站色xx| 日韩免费在线免费观看| 91精品久久久久久久久久久久久久| 亚洲自拍偷拍在线| 国产va免费精品高清在线| 日韩视频免费看| 国产精品老牛影院在线观看| 欧美日韩美女视频| 欧美成年人视频网站| 国产男女猛烈无遮挡91| 亚洲美女www午夜| 91精品久久久久久久久| 免费91麻豆精品国产自产在线观看| 一本色道久久综合狠狠躁篇的优点| 久久伊人91精品综合网站| 国产成人精品视频在线| 亚洲国产成人精品女人久久久| 日韩中文字幕亚洲| 亚洲va久久久噜噜噜| 精品色蜜蜜精品视频在线观看| 久久91精品国产| 日韩av一区二区在线观看| 欧美日韩国产精品一区二区三区四区| 中文字幕在线看视频国产欧美| 国产视频精品久久久| 国模叶桐国产精品一区| 欧美成人精品影院| 精品国产户外野外| 色久欧美在线视频观看| 中文字幕日韩在线观看|