java 数组排序论文_Java 7是否对方法Arrays.Sort使用Tim Sort?
是! ...也沒有
摘要
在當(dāng)前的Open JDK 0實(shí)現(xiàn)中,Tim Sort通常用于對(duì)對(duì)象數(shù)組(即byte和好友)進(jìn)行排序-但是對(duì)于基本數(shù)組(byte方法的其余部分)使用了多種其他方法。
對(duì)于基元,試探法可在各種排序方法中進(jìn)行選擇,例如快速排序,合并排序,計(jì)數(shù)排序3。 取決于要排序的數(shù)據(jù)。 這些決策中的大多數(shù)都是根據(jù)要排序的數(shù)組的類型和大小簡單地預(yù)先做出的,但是對(duì)于byte和short元素,該決策實(shí)際上是根據(jù)測(cè)得的數(shù)組排序進(jìn)行自適應(yīng)的。 因此,在許多情況下,您會(huì)在適應(yīng)/自省(TimSort或類似的合并排序)之上擁有適應(yīng)/自省(啟發(fā)式算法選擇算法)!
細(xì)節(jié)
除非用戶已通過將系統(tǒng)屬性short設(shè)置為true來明確請(qǐng)求舊版行為,否則Tim排序可用于大多數(shù)對(duì)象,例如byte。
對(duì)于基元,情況更加復(fù)雜。 至少從JDK 8(版本byte)開始,根據(jù)要排序的數(shù)組的大小,原始類型和所測(cè)得的數(shù)組的“排序度”,使用了各種試探法。 以下是概述:
對(duì)于字節(jié)1以外的所有基本類型,少于47個(gè)元素的數(shù)組都使用插入排序進(jìn)行了簡單排序(請(qǐng)參閱byte)。 當(dāng)對(duì)使用合并或快速排序且子數(shù)組的大小降至閾值以下時(shí)出現(xiàn)的子數(shù)組進(jìn)行排序時(shí),也會(huì)使用此閾值。 因此,某種形式的插入排序?qū)⒂糜诟鞣N排序,對(duì)于小數(shù)組,這是唯一使用的算法。
對(duì)于基本類型byte、short和char,計(jì)數(shù)排序用于較大的數(shù)組。 這是一種簡單的排序,需要花費(fèi)Object[]的時(shí)間,其中range是字節(jié)(256)或short / char(65536)值的總數(shù)。 排序涉及分配range值的基礎(chǔ)數(shù)組,因此僅在要排序的元素?cái)?shù)量占總范圍的很大一部分時(shí)才使用它。 特別是,它用于大于29個(gè)元素的字節(jié)數(shù)組(即?11%的范圍)和大于3200個(gè)元素的short / char數(shù)組(約5%的范圍)。
對(duì)于字節(jié)數(shù)組,始終使用以上兩種方法之一。
對(duì)于高于插入排序閾值的byte和short陣列以及高于插入排序閾值和低于計(jì)數(shù)排序閾值的char/294872508633081515陣列,可以使用以下兩種算法之一:雙數(shù)據(jù)點(diǎn)快速排序或合并排序。 使用哪一個(gè)取決于對(duì)數(shù)組排序的度量:將輸入分為升序或降序元素。 如果此類運(yùn)行的數(shù)量大于66,則該數(shù)組被認(rèn)為大部分未排序,并使用雙軸快速排序進(jìn)行排序。 否則,該數(shù)組被認(rèn)為是最有序的,并使用mergesort(以已經(jīng)枚舉的運(yùn)行作為起點(diǎn))。
盡管有一些區(qū)別,但找到運(yùn)行然后使用mergesort對(duì)它們進(jìn)行排序的想法實(shí)際上與TimSort非常相似。 因此,至少對(duì)于某些參數(shù),JDK使用的是運(yùn)行感知的合并排序,但對(duì)于參數(shù)的許多其他組合,則使用的是不同的算法,總共至少使用5種不同的算法!
基本原理
byte與原始語言不同的排序行為背后的原因可能至少有兩方面:
1)要求byte的類別必須穩(wěn)定:類別均等的對(duì)象將以與輸入相同的順序出現(xiàn)。 對(duì)于基元數(shù)組,不存在這樣的概念:基元完全由它們的值定義,因此穩(wěn)定和不穩(wěn)定排序之間沒有區(qū)別。 這允許原始排序免除對(duì)穩(wěn)定算法的需求,而有利于速度。
2)各種byte需要涉及short方法,這可能是任意復(fù)雜和昂貴的。 即使char方法很簡單,除非整個(gè)內(nèi)聯(lián)方法都可以內(nèi)聯(lián)2,否則通常會(huì)存在方法調(diào)用開銷。 因此,即使以一些額外的算法復(fù)雜性為代價(jià),通常也會(huì)將各種Object[]偏向于使總比較最小化。
另一方面,原始數(shù)組的排序只是直接比較原始值,這些原始值通常需要一個(gè)或兩個(gè)周期。 在這種情況下,應(yīng)同時(shí)考慮比較成本和周圍算法,對(duì)算法進(jìn)行優(yōu)化,因?yàn)槎叩拇笮】赡芟嗤?/p>
0至少對(duì)于Java 7和Java 9之間的版本,當(dāng)然,它也包括基于Open JDK的Oracle JDK。 其他實(shí)現(xiàn)可能也使用類似的方法,但是我沒有檢查。
1對(duì)于字節(jié)數(shù)組,插入排序閾值實(shí)際上是29個(gè)元素,因?yàn)檫@是使用計(jì)數(shù)排序的下限。
2這似乎不太可能,因?yàn)樗艽蟆?/p>
3計(jì)數(shù)排序僅用于16位以下的有限范圍內(nèi)的值:byte、short或char。
總結(jié)
以上是生活随笔為你收集整理的java 数组排序论文_Java 7是否对方法Arrays.Sort使用Tim Sort?的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 水上飞机的种类和作用(海上救援任务中的水
- 下一篇: m5310模组数据上传至onenet_硬