JDK1 8中的陣列排序

2022-07-11 16:18:09 字數 1505 閱讀 6834

根據不同的情況,選擇不同的排序演算法。

1、當需要排列的元素較少的時候,採用普通的插入排序

當被排序的陣列長度小於47但排序不是從陣列起始位置開始的時候,那麼就會選擇哨兵插入排序的方式進行排序。

這種情況主要是當sort被雙基準快排遞迴呼叫的時候才會使用

2、如果元素較多,大於插入排序的閾值,但是小於歸併排序的閾值,這時採用快速排序

在進行快排之前,首先會將這個不長不斷的陣列按照1/7的長度劃分,最後劃分後的結果為:

然後對這5個劃分點進行排序:

2.1 如果這五個劃分點的資料倆倆各不相同,則以第乙個劃分點和最後乙個劃分點作為基準點,採用雙基準快排;

採用雙基準快排也有優化的地方,如果中間的元素過多(超過整個排序部分的七分之四),將會針對這一區間內的重複鍵進行優化。

與基準1和基準2 相同的鍵將會被分到前後兩個分割槽,並會被從接下來要繼續遞迴排序的中間分割槽中剔除,盡可能減少了中間分割槽的大小。

for (int k = less - 1; ++k <= great; )  else if (ak == pivot2) 

}if (a[great] == pivot1) else

a[great] = ak;

--great;}}

2.2 如果這五個劃分點有相同的情況,則採用三路快排。

3、如果陣列的長度超過了快排的閾值

首先進行有序性的判斷,判斷這個陣列是否是基本有序

將有序部分中斷處的位置記錄下來,如果中斷個數大於某個閾值則判斷為無序,反之有序。

3.1 如果是基本有序,則採用歸併方式排序,這裡會按照剛才記錄的有序部分的中斷點作為歸併點。

3.2 如果判定為無序,則依然採用快排。

jdk 1 8中的list排序

首先看看collections實現 public static void sort listlist,comparatorc public static extends comparable void sort listlist collections的實現可以看出,排序實現分為兩種 是否實現了co...

Jdk1 8中的LinkHashMap實現原理

linkedhashmap繼承自hashmap,是hash表和煉表的實現,並且依靠著雙向鍊錶保證了迭代順序是插入的順序。如果 乙個key重新插入到linkedhashmap中,那麼這個插入順序是無效的,也就是說,如果m.put k,v 時,呼叫m.containskey k 將會返回true,更新v...

jdk1 8常用總結

1.查詢集合裡的第乙個物件 filter 例 查詢listlist 中username為小明的物件t list.stream filter findfirst 1 list.stream filter e 小明 equals e.getusername findfirst 2.查詢滿足條件的物件,並...