【Java】睡眠排序
寫這個(gè)東西的緣由
這是一個(gè)羞恥度爆表的排序,那天跟朋友開玩笑,能不能用線程休眠操縱排序,朋友楞了一下,說(shuō)還真有。。。我傻了,突然想想好像真有,就是這個(gè)睡眠排序。
最后長(zhǎng)嘆一口氣,設(shè)計(jì)者腦洞真大。。。
這是個(gè)神馬玩意&&有何神奇之處
排序算法一般是力求兼顧時(shí)間和空間的平衡,而睡眠排序算法卻像是一個(gè)玩笑,當(dāng)時(shí)間和空間兩者消耗足夠大,才能達(dá)到最終“精確”排序的目的。
原理/基本思想是什么
基于根據(jù)CPU的調(diào)度算法實(shí)現(xiàn)。
我們要對(duì)一組數(shù)據(jù)進(jìn)行排序,不能存在負(fù)數(shù)值,這個(gè)數(shù)是多大,那么就在線程里睡眠它的10倍時(shí)間(ms)再加10,不是睡眠和它的數(shù)值一樣大的原因是,當(dāng)數(shù)值太小時(shí),誤差太大,睡眠的時(shí)間不比輸出的時(shí)間少,那么就會(huì)存在不正確的輸出結(jié)果。
(其實(shí),我真的覺得容易出問(wèn)題,因?yàn)槟慵词棺尵€程結(jié)束了休眠,也不見得能立刻被執(zhí)行。。。不好說(shuō)哇)
實(shí)現(xiàn)原理
構(gòu)造 n 個(gè)(n為待排序元素個(gè)數(shù))線程(自定義),它們和這 n 個(gè)數(shù)一一對(duì)應(yīng)。
初始化后,線程都按照指定的時(shí)間開始休眠,等休眠時(shí)間到了以后結(jié)束休眠,等被執(zhí)行的時(shí)候輸出它對(duì)應(yīng)的數(shù)。
這樣,最小的數(shù)對(duì)應(yīng)的線程最早醒來(lái),這個(gè)數(shù)最早被輸出(理論上)。
等所有線程都結(jié)束休眠并被執(zhí)行完成,排序就結(jié)束了。
實(shí)現(xiàn)代碼(Java)
線程類的構(gòu)建
/*** 玄學(xué)的開始——構(gòu)造線程子類*/ public class SortThread extends Thread { //待排序的數(shù)private int data = 0; public SortThread(int data){ this.data = data; } @Overridepublic void run(){ try { //睡眠指定的時(shí)間為數(shù)值的10倍再加上10sleep(data * 10 + 10);} catch (InterruptedException e) { e.printStackTrace(); } //輸出該數(shù)System.out.println(data); } }下面是弱智般的實(shí)現(xiàn)算法(前提是會(huì)寫基本的多線程)。。。
public static int[] sort(int[] array) {//創(chuàng)建指定長(zhǎng)度的線程數(shù)組SortThread[] threadList = new SortThread[array.length]; //指定線程數(shù)組中每個(gè)線程的值datafor (int i = 0; i < threadList.length; i++) { threadList[i] = new SortThread(arr[i]); } //開啟每個(gè)線程for (SortThread thread : threadList) { thread.start(); } }吐槽
腦洞真大。。。。。。
時(shí)間復(fù)雜度是o(n),可是又怎樣……
總結(jié)
以上是生活随笔為你收集整理的【Java】睡眠排序的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: cmake 常用变量和常用环境变量
- 下一篇: java美元兑换,(Java实现) 美元