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