作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
这是基数排序的伪代码:
Pseudocode for Radix Sort:
Radix-Sort(A, d)
// Each key in A[1..n] is a d-digit integer. (Digits are
// numbered 1 to d from right to left.)
1. for i = 1 to d do
Use a stable sorting algorithm to sort A on digit i.
这是基数排序的 Scala 代码:
object RadixSort {
val WARP_SIZE = 32
def main(args: Array[String]) = {
var A = Array(123,432,654,3123,654,2123,543,131,653,123)
radixSortUintHost(A, 4).foreach(i => println(i))
}
// LSB radix sort
def radixSortUintHost(A: Array[Int], bits: Int): Array[Int] = {
var a = A
var b = new Array[Int](a.length)
var rshift = 0
var mask = ~(-1 << bits)
while (mask != 0) {
val cntArray = new Array[Int](1 << bits)
for (p <- 0 until a.length) {
var key = (a(p) & mask) >> rshift
cntArray(key)+= 1
}
for (i <- 1 until cntArray.length)
cntArray(i) += cntArray(i-1)
for (p <- a.length-1 to 0 by -1) {
var key = (a(p) & mask) >> rshift
cntArray(key)-= 1
b(cntArray(key)) = a(p)
}
val temp = b
b = a
a = temp
mask <<= bits
rshift += bits
}
b
}
}
这是基数排序的 Haskell 代码:
import Data.Bits (Bits(testBit, bitSize))
import Data.List (partition)
lsdSort :: (Ord a, Bits a) => [a] -> [a]
lsdSort = fixSort positiveLsdSort
msdSort :: (Ord a, Bits a) => [a] -> [a]
msdSort = fixSort positiveMsdSort
-- Fix a sort that puts negative numbers at the end, like positiveLsdSort and positiveMsdSort
fixSort sorter list = uncurry (flip (++)) (break (< 0) (sorter list))
positiveLsdSort :: (Bits a) => [a] -> [a]
positiveLsdSort list = foldl step list [0..bitSize (head list)] where
step list bit = uncurry (++) (partition (not . flip testBit bit) list)
positiveMsdSort :: (Bits a) => [a] -> [a]
positiveMsdSort list = aux (bitSize (head list) - 1) list where
aux _ [] = []
aux (-1) list = list
aux bit list = aux (bit - 1) lower ++ aux (bit - 1) upper where
(lower, upper) = partition (not . flip testBit bit) list
我的问题是:你能为基数排序制定幺半群或半群吗?
最佳答案
基数排序不变式是使用前 k 位对数据进行排序。如果您想要添加更多已排序或未排序数据的操作,那么您需要的是合并排序功能而不是基数。如果您要添加的是所有记录中的数据位,您可以使用幺半群。
编辑:幺半群的哈特是一种结合运算。我们可以将排序位视为应用偏序的一种方式。您一点一点地注入(inject)所有记录的数据。每个位都应用一个部分顺序。这是关联的,您可以合并一些位以获得更复杂的部分顺序。注意顺序很重要,但它仍然是关联的。因此可以被视为一个单子(monad)
关于scala - 你能为基数排序制定一个幺半群或半群吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21933737/
我是一名优秀的程序员,十分优秀!