1. 程式人生 > >Collections.sort()和Arrays.sort()排序演算法選擇

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.sortArrays.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 思想 選擇排序的思想非常直接,不是要排序麼?那好,我就從所有序列中先找到最小的,然後放到第一個位置。之後再看剩餘元素中最小的,放到第二個位置……以此類推,就可以完成整個的排序工作了。可以很清楚的發現,選擇