搞笑排序之睡眠排序

2021-10-07 10:45:21 字數 1955 閱讀 9385

乙個程式的執行時間受多種因素影響,因此它的返回結果不一定正確

構造n個執行緒,它們和這n個數一一對應。初始化後,執行緒們開始睡眠,等到對應的數那麼多個時間單位後各自醒來,然後輸出它對應的數。這樣最小的數對應的執行緒最早醒來,這個數最早被輸出。等所有執行緒都醒來,排序就結束了

package com.oceanstar;

public

class

treenode

;//建立指定長度的執行緒陣列

sortthread[

] sortthreads =

newsortthread

[arr.length]

;//指定每個執行緒陣列的值

for(

int i =

0; i < sortthreads.length; i++

)//開啟每個執行緒

for(

int i =

0; i < sortthreads.length; i++)}

}class

sortthread

extends

thread

public

void

run(

)catch

(interruptedexception e)

//輸出該數

system.out.

printf

("%d\t"

,s);

}}

package main

import

("fmt"

"time"

)var flag bool

var count int

var c chan

bool

func

tosleep

(data int

)func

listen

(size int)}

}}func

main()

flag =

true

c =make

(chan

bool

,len

(arr)

)// 管道:用來傳輸元素

for i :=

0; i <

len(arr)

; i++

golisten

(len

(arr)

)for flag

}

package main

import

("fmt"

"time"

)func

num_sleep

(sec int

, c chan

int)

func

main()

c :=

make

(chan

int,

len(arr)

)// 管道:用來傳輸元素

for i :=

0; i <

len(arr)

; i++

var res [

]int

for i :=

0; i <

len(arr)

; i++

close

(c) fmt.

println

(res)

}

**很粗略,很多bug。比如

(1) 搞不定負數。

(2)比如輸入資料很相近時會有誤差

(3)輸入資料很多時,這些執行緒不能看作是同時啟動等等…

對於(1),可以用乙個在恆正的函式把輸入對映成時間;

(2),可以乘個係數,放大資料間的差,但是依然搞不定重複的資料;

(3),試著讓演算法在多個物理核上真正的並行起來

睡眠排序法

睡眠排序演算法是一種比較另類有趣的排序演算法,其核心思想與cpu排程機制相關,是通過多執行緒讓每乙個資料元素睡眠一定規律的時間,睡眠時間要和自身資料大小存在一定的規律,睡眠時間短的先進行輸出,睡眠長的後輸出,從而實現資料有序輸出。存在缺點 若睡眠時間之間相差很小時,容易出現誤差,為了減小誤差,一般需...

天才演算法 睡眠排序

public class sleepsort 建立指定長度的執行緒陣列 sortthread sortthreads new sortthread arr.length 指定每個執行緒陣列的值 for int i 0 i sortthreads.length i 開啟每個執行緒 for int i ...

腦洞大開的睡眠排序

睡眠排序演算法,嘻嘻,本身只是乙個腦洞開啟的排序演算法。排序演算法一般是力求兼顧時間和空間的平衡,而睡眠排序演算法卻像是乙個玩笑,當時間和空間兩者消耗足夠大,才能達到最終精確排序的目的。實現原理 構造 n 個執行緒,它們和這 n 個數一一對應。初始化後,執行緒們開始睡眠,等到對應的數那麼多個時間單位...