轉載自 這裡
前言 :
在之前所介紹過的排序方法,都是屬於「比較性」的排序法,也就是每次排序時 ,都是比較整個鍵值的大小以進行排序. 這邊所要介紹的「基數排序法」(radix sort)則是屬於「分配式排序」(distribution sort),基數排序法會使用到「桶子」(bucket),顧名思義,它是透過鍵值的部份資訊,將要排序的元素分配至某些「桶」中,藉以達到排序的作用,基數排序法是屬於穩定性的排序,其時間複雜度為 O(nlog(r)m),其中r為所採取的基數,而m為堆數,在某些時候,基數排序法的效率高於其它的比較性排序法!
解法 :
基數排序的方式可以採用LSD(Least sgnificant digital)或MSD(Most sgnificant digital),LSD的排序方式由鍵值的最右邊開始,而MSD則相反,由鍵值的最左邊開始. 以LSD為例,假設原來有一串數值如下所示 :
首先根據個位數的數值,在走訪數值時將它們分配至編號0到9的桶子中 :
接下來將這些桶子中的數值重新串接起來,成為以下的數列 :
接著再進行一次分配,這次是根據十位數來分配 :
接下來將這些桶子中的數值重新串接起來,成為以下的數列 :
這時候整個數列已經排序完畢;如果排序的對象有三位數以上,則持續進行以上的動作直至最高位數為止. LSD的基數排序適用於位數小的數列,如果位數多的話,使用MSD的效率會比較好,MSD的方式恰與LSD相反,是由高位數為基底開始進行分配,其他的演 算方式則都相同.
實作 :
補充說明 :
* [ Data Structures with Java ] Section 15.2 : The Radix Sort
前言 :
在之前所介紹過的排序方法,都是屬於「比較性」的排序法,也就是每次排序時 ,都是比較整個鍵值的大小以進行排序. 這邊所要介紹的「基數排序法」(radix sort)則是屬於「分配式排序」(distribution sort),基數排序法會使用到「桶子」(bucket),顧名思義,它是透過鍵值的部份資訊,將要排序的元素分配至某些「桶」中,藉以達到排序的作用,基數排序法是屬於穩定性的排序,其時間複雜度為 O(nlog(r)m),其中r為所採取的基數,而m為堆數,在某些時候,基數排序法的效率高於其它的比較性排序法!
解法 :
基數排序的方式可以採用LSD(Least sgnificant digital)或MSD(Most sgnificant digital),LSD的排序方式由鍵值的最右邊開始,而MSD則相反,由鍵值的最左邊開始. 以LSD為例,假設原來有一串數值如下所示 :
首先根據個位數的數值,在走訪數值時將它們分配至編號0到9的桶子中 :
接下來將這些桶子中的數值重新串接起來,成為以下的數列 :
接著再進行一次分配,這次是根據十位數來分配 :
接下來將這些桶子中的數值重新串接起來,成為以下的數列 :
這時候整個數列已經排序完畢;如果排序的對象有三位數以上,則持續進行以上的動作直至最高位數為止. LSD的基數排序適用於位數小的數列,如果位數多的話,使用MSD的效率會比較好,MSD的方式恰與LSD相反,是由高位數為基底開始進行分配,其他的演 算方式則都相同.
實作 :
補充說明 :
* [ Data Structures with Java ] Section 15.2 : The Radix Sort
This message was edited 6 times. Last update was at 27/10/2011 10:27:31
沒有留言:
張貼留言