一種新奇的數值排序演算法

2022-08-31 09:48:09 字數 2481 閱讀 8223

對於支援 稀疏陣列(sparse array) 的程式語言來說,有一種理論上可行的排序演算法可以用,具體演算法思想如下:

構建乙個空陣列(lua裡是 table),用陣列下標來表示資料情況,陣列的值來表示出現次數,然後只要將未排序陣列裡的資料依此對應進去,就排序好了,這個對應後的陣列稍作處理就可以得到目標資料,感覺效率很高,但演算法的通用性挺糟糕的。

lua的具體實現**:

function sort(arr,num)

-- build temp array.

local temp = {}

for i,v in pairs(arr) do

if temp[v] == nil then

temp[v] = 0

endtemp[v] = temp[v] + 1

end-- sort (only can be in ascending order)

local i = 0

local c = 1

while c <= num do

if temp[i] ~= nil then

while temp[i] > 0 do

arr[c] = i

c = c + 1

temp[i] = temp[i] - 1

endend

i = i + 1

endend

使用:

local arr = {}

local num = 100

local min = 1

local max = 1000

math.randomseed(os.time())

function init(arr,num,min,max)

local i = 0

for i = 1,num do

arr[i] = math.random(min,max)

endendinit(arr,num,min,max)

local out_str = ""

for i,v in pairs(arr) do

--print("["..i.."] = "..v)

out_str = out_str..v..","

if i % 20 == 0 then

out_str = out_str .. "\n"

endendprint("before sorting:")

print(out_str)

sort(arr,num)

out_str = ""

for i,v in pairs(arr) do

--print("["..i.."] = "..v)

out_str = out_str..v..","

if i % 20 == 0 then

out_str = out_str .. "\n"

endendprint("after sorting:")

print(out_str)

輸出類似於:

before sorting:

930,266,744,937,898,751,245,110,95,262,907,562,738,228,37,940,870,268,274,472,

819,838,578,216,488,739,530,28,682,889,236,611,155,980,548,52,731,793,161,825,

54,68,387,791,296,424,731,165,692,5,636,511,842,214,726,330,952,256,358,634,

144,594,245,299,573,792,350,303,584,511,128,637,579,514,428,875,938,159,39,629,

164,675,139,6,888,865,336,840,120,693,473,264,286,718,562,858,509,912,161,93,

after sorting:

5,6,28,37,39,52,54,68,93,95,110,120,128,139,144,155,159,161,161,164,

165,214,216,228,236,245,245,256,262,264,266,268,274,286,296,299,303,330,336,350,

358,387,424,428,472,473,488,509,511,511,514,530,548,562,562,573,578,579,584,594,

611,629,634,636,637,675,682,692,693,718,726,731,731,738,739,744,751,791,792,793,

819,825,838,840,842,858,865,870,875,888,889,898,907,912,930,937,938,940,952,980,

很久之前就有這個想法了,今天終於用**實現了,看看就好,別用在工作環境裡。

一種快速排序演算法

using system class program for int l 0 l src.length l src count temp l i 3 0xff temp l static void main string args watch.stop console.writeline quick...

快速排序演算法的一種實現

參考部落格 白話經典演算法系列之六 快速排序 快速搞定 功能 實現快速排序演算法 include 方法宣告 intadjustsort int a,int m,int n void quicksort int a,int m,int n int main void printf 排序前的陣列順序.n...

每天一種演算法 選擇排序

選擇排序是這樣的,首先,找到最小的乙個數,放在第乙個位置,然後在剩下的元素中,找到最小的 放在第二個位置,再在除過這兩個元素的剩下的裡面找到最小的,就是第三小。這樣依次類推。最後得到的數列,就是從小到大了。這個排序的效率不是很高。如果有100個數,要比較100 99 98 1 次。package b...