對於支援 稀疏陣列(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...