這是學排序演算法時候意外的查到的方法,對應現實中的算盤?現實中操作很快,操作能同時進行;但是計算機中需要時間,如果並行可以但是吃硬體。
將每個數看成n個珠子(不能用於小數,如果有負數也麻煩,0也頭疼),把珠子按順序插在杆上,杆的數量等於最大的數,讓它們下落。
所以需要 [max][max] 的陣列用於表示數,假設每個數對應一行,排序時把每一列往底下歸。時間複雜度 o(n),空間複雜度 o(n^2)。
直接放 wikipedia 的演示圖:
演算法本身不太實用,我就寫了一下基本方法,展示思路,**質量不高,因為用的二維陣列沒簡化所以複雜度 o(n^3) 了。
#include
#include
using std::max_element, std::cout, std::endl;
void
insertbead
(bool
* row,
int value)
;int
*beadsort
(int
* num,
short len)
;int
getnum
(bool
* row,
int max)
;int
main
(int argc,
const
char
* ar**)
;short len =
sizeof
(num)
/sizeof
(int);
int* after =
beadsort
(num, len)
;for
(short i =
0; i < len; i++
)printf
("%d "
, after[i]);
return0;
}int
*beadsort
(int
* num,
short len)
for(
short i =
0; i < len; i++
) num[i]
=getnum
(beadmap[i]
, max)
;return num;
}// 將每個數插入杆
void
insertbead
(bool
* row,
int value)
// 下落後的每行計數
intgetnum
(bool
* row,
int max)
懶得再寫 py 的,直接 copy 過來放著…沒驗證對不對,看看就好。
def
bead_sort
(l):
b =l_len =
len(l)-1
index =
0 count =
0while
(any
(l))
:if l[index]!=0
: count +=
1 l[index]-=1
if index == l_len:
index =
0 count =
0else
: index +=
1if count !=0:
result =
for i, v in
enumerate
(b[:-1
]):if v == b[i+1]
:continue
else
: result.extend(
[i +
1for _ in
range
(v - b[i +1]
)])
result.extend(
[len
(b)for _ in
range
(max
(b)-
len(result))]
)return result
if __name__ ==
"__main__"
:print
(bead_sort([2
,4,1
,3,3]))
這種演算法必然用到 n*n 陣列,雖然複雜度是 n 但是肯定比正常方法慢。 實用的排序演算法
選擇排序的有序化是從第頭開始有序化的。如 n個元素 從小向大排序 第乙個和後面n 1個元素一一比較 如果發現後面元素的比他小 交換他們兩 一輪下去就可以保證第乙個元素是最小的 後面從第二個元素開始往後面比較 重複以上步驟直到倒數第二個數字 public class xuanze for int i ...
實用排序演算法整理 Python
def bubble sort nums n 2 1 n len nums for i in range n for j in range n 2,i 1,1 if nums j nums j 1 nums j nums j 1 nums j 1 nums j return nums def sho...
簡單實用演算法 氣泡排序
變數定義 注 氣泡排序如果能在內部迴圈第一次執行時,使用乙個bool值來表示有無需要交換的可能,也有可能把最好的複雜度降低到o n 在這個情況,在已經排序好的數列就無交換的需要。演算法 c 氣泡排序 public void bubblesort intnums if exchange 本趟排序未發生...