Java数组排序解码
排序是我們?cè)谟?jì)算機(jī)科學(xué)中學(xué)習(xí)的第一個(gè)算法。 排序是一個(gè)非常有趣的領(lǐng)域,它有大約20多種算法,而且總是很難確定哪種算法最好。 排序算法的效率是根據(jù)所需的時(shí)間和所需的空間來(lái)衡量的。 一些時(shí)間氣泡排序是最好的,因?yàn)樗鼪]有空間需求,并且對(duì)于空間受限或無(wú)法隨機(jī)訪問元素的設(shè)備來(lái)說,它可以很好地?cái)M合。
如今,我們傾向于使用庫(kù)排序功能,大多數(shù)語(yǔ)言庫(kù)排序功能都是自適應(yīng)的,并且根據(jù)數(shù)據(jù)大小使用最佳算法。
在博客中,我將分享如何在Java Arrays.sort函數(shù)中做出這些決定。 決策基于數(shù)據(jù)類型和大小
–字節(jié)
對(duì)于字節(jié)數(shù),java API在計(jì)數(shù)排序或插入排序之間進(jìn)行決定。
如果輸入數(shù)組的大小小于29,則使用插入排序,插入排序的可視化
對(duì)于大型數(shù)組,使用計(jì)數(shù)排序,它基于字節(jié)范圍為-128到128的事實(shí),它可以用作快速排序的優(yōu)勢(shì)。 計(jì)數(shù)排序?qū)?nèi)存的需求很小,并且插入就位,因此總體上并沒有進(jìn)行太多分配,并且在對(duì)字節(jié)數(shù)組進(jìn)行排序時(shí)將使垃圾回收器感到滿意。
–字符
對(duì)于char決定是在Counting Sort和Dual Pivot QuickSort之間
如果輸入的大小大于3.2K,則對(duì)使用的計(jì)數(shù)進(jìn)行計(jì)數(shù),并分配65K大小的數(shù)組以實(shí)現(xiàn)排序。 對(duì)于使用雙樞軸的較小陣列的快速排序變體,可以使用快速排序的可視化效果。
所使用的QuickSort也就位,因此在內(nèi)存方面明智的做法是在Garbage Collector上沒有太多負(fù)載。
–整數(shù)/長(zhǎng)
對(duì)于整數(shù)/長(zhǎng)整數(shù),隨著“ 合并排序”的輸入,事情變得很有趣。
對(duì)于小于256的輸入,有兩個(gè)選項(xiàng)可用
–如果輸入小于47,則使用“ 插入排序” ,在其他情況下,則使用“雙樞軸快速排序” 。
對(duì)于大型輸入數(shù)組,有一些很好的邊緣情況檢查
–如果數(shù)組已經(jīng)按升序或降序排序,則通過單循環(huán)檢查。
–如果數(shù)組元素相同,則使用“快速排序”,因?yàn)樵谶@種情況下它最有效。
–或者,如果元素真的被弄亂了,例如每個(gè)偶數(shù)元素都大于奇數(shù)元素,那么它將使用快速排序。
最后所有這些檢查失敗,然后使用合并排序并分配相同大小的新數(shù)組并執(zhí)行排序。 合并排序快速?gòu)?fù)習(xí)
關(guān)于Integer排序的重要注意事項(xiàng)是,如果已經(jīng)對(duì)A??rray進(jìn)行了排序,則不會(huì)分配任何內(nèi)存,并且是否正在檢查QuickSort是否啟動(dòng)了內(nèi)存分配。
–浮動(dòng)/雙
Float對(duì)NAN進(jìn)行了特殊的優(yōu)化,所有NAN都移至數(shù)組末尾,并從排序中跳過。 處理完NAN值后,排序?qū)⑼ㄟ^與INTEGER數(shù)據(jù)類型相同的檢查。
–按對(duì)象排序
集合排序幾乎沒有什么不同的規(guī)則,對(duì)于集合而言,僅在Merge Sort和Timsort之間。 默認(rèn)情況下,使用Timsort,它是合并和插入排序的混合。
合并排序已不再使用,并且僅在打開“ java.util.Arrays.useLegacyMergeSort”標(biāo)志時(shí)使用。
在JDK 8中,還添加了基于數(shù)組輸入大小的并行排序選項(xiàng),對(duì)于大小大于8K的數(shù)組,則使用并行版本的sort。
翻譯自: https://www.javacodegeeks.com/2016/06/java-arrays-sort-decoded.html
總結(jié)
以上是生活随笔為你收集整理的Java数组排序解码的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 备案注销(注销公司备案)
- 下一篇: Java 9附加流