1. 程式人生 > >Arrays.sort()的內部排序機制

Arrays.sort()的內部排序機制

  陣列的操作可以使用java提供的工具類Arrays,其中Arrays.sort()方法用於陣列的排序。

  基本資料型別陣列的操作,使用經過優化的快速排序演算法
  當陣列的規模較小時,直接插入排序的比較次數並不會比快排或者歸併多多少,其效率反而不如簡單排序演算法,所以在陣列規模小於7時,使用直接插入排序,
  當陣列規模較大時,合理的選擇快排的樞軸元素,如在規模小於40時,在陣列的首,中,尾三個位置上的數,取中間大小的數做樞軸;在陣列規模大於40時,從陣列中取位置均勻分佈的9個數,然後每三個數一組取中間數,最後三個中間數再取中間數。確定樞軸後,與陣列的第一個元素交換,之後的快排與普通快排一樣。
  當陣列中有大量重複元素時,選擇重複元素作為樞軸,然後兩個端各設定兩個工作指標low、high,left、right用於始終指向要交換的元素位置,如5,2,5,6,4,3,5,1,5,7
  從high開始判斷,low <= high,若high位置的元素 >= 基準元素high–,同時若high位置的元素 == 基準元素,high位置的元素與right位置的元素交換,同時right–,繼續直到high位置的元素 < 基準元素。
  從low開始判斷,low <= high,若low位置的元素 <= 基準元素low++,同時若low位置的元素 = 基準元素,low位置的元素與left位置的元素交換,同時left++,繼續直到low位置的元素 > 基準元素。
  low、high位置的元素交換,同時low++、high–,然後再從high開始繼續上面的過程,最後將重複的元素至於序列的兩端,中間的序列分成了兩部分,左面的為小於基準元素的,右面的為大於基準元素的,如5,5,2,1,4,3,7,6,5,5,此時low在7位置,high在3位置。
  將兩端重複的元素都交換到中間後,對兩端不等的元素使用快排,左側外迴圈從下標0開始判斷,若等於樞軸進入內迴圈,內迴圈從下標low - 1開始向前找不等於樞軸的,找到交換,直到外迴圈遇到不等於樞軸的退出;右側外迴圈從下標n - 1開始判斷,若等於樞軸進入內迴圈,內迴圈從下標high + 1開始向後找不等於樞軸的,找到交換,直到外迴圈遇到不等於樞軸的退出。
  
  引用資料型別陣列的排序,使用經過優化的歸併排序演算法。
  當陣列規模j較小時,使用直接插入排序。
  當屬組規模較大時,使用歸併排序,且當合並的兩個有序序列中,低子序列的最高元素小於高子序列的最低元素時,無序執行合併演算法,這個可以在merge演算法裡判斷。

相關推薦

Arrays.sort()的內部排序機制

  陣列的操作可以使用java提供的工具類Arrays,其中Arrays.sort()方法用於陣列的排序。   基本資料型別陣列的操作,使用經過優化的快速排序演算法   當陣列的規模較小時,直接插入排序的比較次數並不會比快排或者歸併多多少,其效率反而不如簡單

去重想到set,排序想到Arrays.sort

pac int java new ner ring urn sys auth package test; import java.util.Arrays; import java.util.Scanner; import java.util.Set; import ja

Arrays.sort()自定義排序的實現

port margin tor urn 排列 util int ava 升序 1. Arrays.sort(T[] a)是對數組元素按字典序進行升序排列 import java.util.*; public class Main { public static

Java 氣泡排序 並與 Arrays.sort(arr) 比較

前段時間收到一個獵頭電話面試,問了關於氣泡排序的.我居然一時間想不起來... 只是回答了,大概倆個for迴圈什麼的... 今天想起來,複習下:        jdk 1.8.0_181 package review; import

Java使用Arrays.sort()方法給物件排序

當我們給一個整型陣列或者浮點型之類的陣列排序的時候,很簡單就可以達到我們排序的目的,無非是排序演算法的問題。那麼,如果我們現在想根據物件的一個屬性值給一個物件陣列進行排序呢? 假如我們現在有一個Car型別,Car類中有一個double型的speed屬性用來描述車輛的速度,現在我們想根據車

Java中Arrays.sort()自定義陣列的升序和降序排序

Java學習中會遇到對陣列進行升序或者降序排序的問題 Java語言提供給我們Array.sort(int [] arr)對陣列進行升序排列 import java.util.Arrays; public class Test1 { public stat

內部排序】三:希爾排序(Shell Sort)的多種實現(不斷優化+原始碼)

當我們看程式碼時,一時不能理解的話。畫下草圖,用例項來分析下,自己舉個例子,跟著程式碼的執行流程一步步走,回過頭來再看就明白了。 希爾排序也是一種插入排序方法,實際上是一種分組插入方法。 一、基本思

Arrays.sort()用的是什麼排序演算法?怎麼優化?

Arrays.sort()用的是快速排序演算法。相信大家對於這個都是瞭解的。 演算法的思想: 選擇基準將陣列一分為二,基準前面的比基準小,基準後面的比基準大,之後分別對這兩

java--陣列排序Arrays.sort())

package day_6_2; import java.util.Arrays; /** * Arrays.sort()排序 * Arrays.toString()列印結果 * */ pub

內部排序】八:歸併排序(Merge Sort)詳解與程式碼

歸併排序是多次將兩個或兩個以上的有序表合併成一個新的有序表。最簡單的歸併是直接將兩個有序的子表合併成一個有序的表。   2-路歸併排序 在內部排序中,通常採用的是2-路歸併排序。即:將含有n個元素的序

Arrays.sort排序方法以及Comparator和Comparable介面的作用

有的時候需要對數組裡的element進行排序。當然可以自己編寫合適的排序方法,但既然Java包裡有自帶的Arrays.sort排序方法,在陣列元素比較少的時候為何不用?   Sorting an Array 1. 數字排序  int[] intArray = new i

JAVA中Arrays.sort()使用兩種方式(Comparable和Comparator介面)對物件或者引用進行排序

package com.dt.Sort; import java.util.Arrays; import java.util.Comparator; /**  * 使用Comparator介面:編寫多個排序方式類實現Comparator介面,並重寫新Comparator介面中的compare()方法 pub

Collections.sort()和Arrays.sort()排序演算法選擇

今天面試的時候,被問到Collections.sort();和Arrays.sort();兩個方法的排序演算法實現,我只記得一個是快速排序一個是歸併排序,但是剛剛看到沒那麼簡單。 Arrays.sort() 先來看看Arrays.sort();,一點進這

Java陣列排序Arrays.sort,以及Comparator介面的用法

轉自:http://java.chinaitlab.com/base/808196.html 有的時候需要對數組裡的element進行排序。當然可以自己編寫合適的排序方法,但既然java包裡有自帶的Arrays.sort排序方法,在陣列元素比較少的時候為何不用?   So

Arrays.sort 按字母書序排序

java中的陣列排序。[1] Arrays.sort(*Array) 需加包import java.util.*;或import java.util.Arrays; Arrays.sort(陣列名)為陣列排序的操作,但這個方法在 java.util 這個包裡面,所以在

內部排序】七:堆排序(Heap Sort)詳解與程式碼(超詳細註釋版)

堆排序是選擇排序的一種,每一趟從待排序的記錄中選出關鍵字最小的記錄,順序放在有序的子表中,直到全部記錄排序完畢。 我這裡做個總結: 二叉堆: 二叉堆其實是一棵有著特殊性質的完全二叉樹,父節點的值總

Arrays.sort()用來自定義排序的使用

compareTo方法: public int compareTo(String anotherString)按字典順序比較兩個字串。該比較基於字串中各個字元的 Unicode 值。按字典順序

java學習記錄——使用Arrays.sort對陣列進行升序排序

public class MaoPaoPaiXu{ public static void main(String[] args){ System.out.println("隨機生成的十個整數是:"); //生成隨機數 int[] ran = new in

java排序函式Arrays.sort對類排序

  在使用排序函式的時候,都要考慮一個排序的方式,尤其是自定義變數,有多個屬性,是以哪一個屬性進行排序。 在C++中可以定義一個結構體,再使用algorithm庫中的sort對變數陣列進行排序,內部使用的是快速排序,前面介紹過快排的過程。同樣java中也有個sort,同樣可

jdk7中Arrays.sort()和Collections.sort()排序方法使用注意

1. 為什麼寫這篇文章 這篇文章的根源是在產品中發現了一個詭異的bug:只能在產品環境下重現,在我的本地開發環境無法重現,而雙方的程式碼沒有任何區別。最後用remotedebug的方法找到異常所在: Exception in thread "main"Java.la