Collections.sort()和Arrays.sort()排序演算法選擇
今天面試的時候,被問到Collections.sort();
和Arrays.sort();
兩個方法的排序演算法實現,我只記得一個是快速排序一個是歸併排序,但是剛剛看到沒那麼簡單。
Arrays.sort()
先來看看Arrays.sort();
,一點進這個方法會看到是這樣子的
public static void sort(int[] a) {
DualPivotQuicksort.sort(a, 0, a.length - 1, null, 0, 0);
}
果然沒這麼簡單,DualPivotQuicksort
翻譯過來就是雙軸快速排序,關於雙軸排序可以去這裡http://www.cnblogs.com/nullzx/p/5880191.html
if (right - left < QUICKSORT_THRESHOLD) {
sort(a, left, right, true);
return;
}
可以發現如果陣列的長度小於QUICKSORT_THRESHOLD
的話就會使用這個雙軸快速排序,而這個值是286。
那如果大於286呢,它就會堅持陣列的連續升序和連續降序性好不好,如果好的話就用歸併排序,不好的話就用快速排序,看下面這段註釋就可以看出
* The array is not highly structured, * use Quicksort instead of merge sort.
那現在再回到上面的決定用雙軸快速排序的方法上,再點進去,發現又會多一條判斷
// Use insertion sort on tiny arrays
if (length < INSERTION_SORT_THRESHOLD)
即如果陣列長度小於INSERTION_SORT_THRESHOLD
(值為47)的話,那麼就會用插入排序了,不然再用雙軸快速排序。
所以總結一下Arrays.sort()方法,如果陣列長度大於等於286且連續性好的話,就用歸併排序,如果大於等於286且連續性不好的話就用雙軸快速排序。如果長度小於286且大於等於47的話就用雙軸快速排序,如果長度小於47的話就用插入排序。真是有夠繞的~
Collections.sort()
再來看看Collections.sort()
,一路點進去,發現會進到Arrays
裡了,來看看又有什麼選擇
public static <T> void sort(T[] a, Comparator<? super T> c) {
if (c == null) {
sort(a);
} else {
if (LegacyMergeSort.userRequested)
legacyMergeSort(a, c);
else
TimSort.sort(a, 0, a.length, c, null, 0, 0);
}
}
會發現如果LegacyMergeSort.userRequested
為true的話就會使用歸併排序,可以通過下面程式碼設定為true
System.setProperty("java.util.Arrays.useLegacyMergeSort", "true");
不過方法legacyMergeSort的註釋上有這麼一句話,說明以後傳統歸併可能會被移除了。
/** To be removed in a future release. */
相關推薦
Collections.sort()和Arrays.sort()排序演算法選擇
今天面試的時候,被問到Collections.sort();和Arrays.sort();兩個方法的排序演算法實現,我只記得一個是快速排序一個是歸併排序,但是剛剛看到沒那麼簡單。 Arrays.sort() 先來看看Arrays.sort();,一點進這
Java的陣列和list升序,降序,逆序函式Collections.sort和Arrays.sort的使用
list升序,降序,逆序List<Integer>list =new ArrayList<Integer>();//如果list是 5 7 2 6 8 1 41、升序:Collections.sort(list) //list: 1 2 4 5 6 7 82、降序:Collection
Arrays.Sort()中的那些排序演算法
本文基於JDK 1.8.0_211撰寫,基於java.util.Arrays.sort()方法淺談目前Java所用到的排序演算法,僅個人見解和筆記,若有問題歡迎指證,著重介紹其中的TimSort排序,其源於Python,並於JDK1.7引入Java以替代原有的歸併排序。 引入 Arrays.Sort方法所
Java8 Collections.sort()及Arrays.sort()中Lambda表示式及增強版Comparator的使用
本文主要介紹Java8 中Arrays.sort()及Collections.sort()中Lambda表示式及增強版Comparator的使用。 import com.google.common.collect.Lists; import org.junit.Assert
Python裡sort()的排序演算法--Timsort簡介
學習計算機的肯定對各種排序演算法都很瞭解,這裡說一下,常用的排序演算法有氣泡排序,插入排序,快速排序等, 而Python裡的sort排序是一種名為Timsort的排序方法,其時間複雜度為O(n log n),而且
資料結構和演算法分析之排序演算法--選擇排序(堆排序)
選擇排序–堆排序 堆排序是一種樹形選擇的排序,是對直接選擇排序的有效改進。 (直接選擇排序:第一次選擇最小值,與第一位數交換,再從後面選擇最小的,和第二位數交換……直至排序結束,共n-1次) 基本思想: 堆的定義如下:具有n個元素的序列(k1,k2,…,
JAVA Arrays.sort()和Collectons.sort() 原理分析
今天終於答辯結束,I’M FREEDOM!!! ^—^ 首先Collections內部也是使用Arrays的sort實現的,因此著重分析Arrays類內的sort是如何實現的 主要分兩種: 對於基本型別,使用調優的快排,雙指標快排 對於引用型別,採用改進
排序演算法--選擇排序之簡單選擇排序
在待排序記錄中,選擇一個最小的數,和第一個記錄交換位置,在剩下n-1個的記錄中選擇最小的和第二個記錄交換,依次類推,最終可以得到一個有序的序列。 程式碼: #include <string.h> #include <malloc.h> #includ
排序演算法之選擇排序(關鍵詞:資料結構/演算法/排序演算法/選擇排序)
假定:有 1 個亂序的數列 nums ,其中有 n 個數。 要求:排好序之後是 從小到大 的順序。 選擇排序演算法 程式碼 from swap import swap def select_sort(nums): n = len(nums) i = 0 while
小甲魚 排序演算法 選擇排序
小甲魚 排序演算法 選擇排序 雖然選擇排序 和 氣泡排序 進行的比較次數是一樣的,但是選擇排序 比 氣泡排序 進行移動的次數少,效率更高 選擇排序: //selectsort.c #include <stdio.h> void Selec
排序演算法----選擇排序
選擇排序的思路是,先從序列中找到最小的元素,放在第一個位置,然後找到第二小的元素,放在第二個位置,以此類推,直到排好所有的值。 時間複雜度:O(n^2),需要進行比較的次數為第一輪n-1,n-2,n-3...1,總的比較次數n*(n-1)/2 例如:a=[1,2,3,4,5,6]
排序演算法---選擇排序
參考網址:https://www.cnblogs.com/onepixel/articles/7674659.html 選擇排序(Selection-sort)是一種簡單直觀的排序演算法。它的工作原理:首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位
最易於理解的排序演算法——選擇排序
我在標題中說選擇排序是最易於理解的演算法,下面就來給大家說說為何選擇排序是最易於理解的演算法。 思想: 以升序為例,在陣列arr中遍歷陣列找到其中最小的那個元素,將其與arr[0]交換,之後在剩餘的陣列中,在尋找最小的元素,將其與arr[1
排序演算法--選擇排序--簡單選擇排序
//選擇排序--簡單選擇排序 void selection_print_list(int list[] , int count) { for(int i = 0 ; i < count ; i++) { printf("%5d" ,
java排序演算法—選擇排序(二)
選擇排序 選擇排序的思想方法:快速排序的思想非常直接,正如名字一樣,將要排序的資料元素選出最小的,將它和資料元素的首位交換位置。再次從剩下的資料元素中 找到最小的元素,放到第二個位置上……以此類推,直到將整個資料元素排序。 程式碼實現 public class selectSor
C語言直接插入排序和折半插入排序演算法的實現
直接插入排序是是一種穩定的排序,其演算法簡便,適用於順序結構和鏈式結構,更適合於基本有序(正序)的情況。其空間複雜度為O(1),時間複雜度為O(n2)。下面是實現演算法: 先是預定義和型別定義: typedef int Status; typedef int ElemTyp
三種基礎排序演算法(選擇排序、插入排序、氣泡排序)
注: 圖片轉自點選開啟連結 以下均使用升序介紹。 選擇排序: 從陣列中找到最小的元素,和第一個位置的元素互換。 從第二個位置開始,找到最小的元素,和第二個位置的元素互換。 ........ 直到選出array.length
排序演算法--選擇篇(簡單選擇,樹形選擇,堆排序)
選擇類排序的基本思想是每一趟在n-i+1(i=1,2,...,n-1)個記錄中選取關鍵字最小的記錄作為有序序列中第i個記錄。本篇在介紹簡單選擇排序的基礎上,給出了其改進演算法--樹形選擇排序和堆排序。 1.簡單選擇排序 演算法思想:第一趟簡單選擇排序時,從第一個記錄開始,
單向冒泡和雙向氣泡排序演算法
/************************************************************************/ /* Bubble Sort
排序演算法—選擇排序演算法分析與實現(Python)
December 23, 2015 12:31 PM 思想 選擇排序的思想非常直接,不是要排序麼?那好,我就從所有序列中先找到最小的,然後放到第一個位置。之後再看剩餘元素中最小的,放到第二個位置……以此類推,就可以完成整個的排序工作了。可以很清楚的發現,選擇