概述
排序分為內部排序和外部排序,內部排序是待排序的元素全部放在內存,并在內存中調整它們的順序。外部排序是部分元素放到內存中,在內外存間調整元素的順序。我們通常說的八大排序直接插入排序、希爾排序、簡單選擇排序、冒泡排序、快速排序、堆排序、歸并排序、基數排序都是內部排序,下面來具體介紹這八種排序的如何用JAVA實現,以及它們所需的時間復雜度和空間復雜度。
直接插入排序
基本思想:將一個待排序的元素插入到已經排好序的序列中,如果待排序的元素與有序序列的中的某個元素相等,則把待排序元素插到該元素后面。
算法實現:
時間復雜度:
直接插入排序是穩定的排序,其時間復雜度是O(n^2)。
說明:穩定的排序是指相等的元素經過排序后,其相對位置沒有發生改變。
說明:如果待排序的元素是正序(從小到大排列),每插入一個元素只需比較一次,這樣時間復雜度就是O(n)。反之,如果待排序的元素是逆序(從大到小排列),當插入第i個元素時,需要比較i次,這樣時間復雜度是O(n^2)。
希爾排序
基本思想:
希爾排序實質上是一種分組插入排序,其先將整個待排元素序列分割成若干個子序列(由距離為d的元素組成)分別進行直接插入排序,然后依次減少距離d再進行排序,當距離為1時,再對全體元素進行一次直接插入排序。
算法實現:
時間復雜度:
希爾排序中相同的元素可能在各自組的插入排序中移動,最后其穩定性會被打亂,所以希爾排序是不穩定的,其時間復雜度是O(nlogn)。
簡單選擇排序
基本思想:
在n個待排序的元素中找取最小的元素與第一個元素交換位置,然后在n-1個元素中找取最小的元素與第二元素交換位置,直到n=1為止。
算法實現:
時間復雜度:
簡單選擇排序是不穩定的排序,其時間復雜度是O(n^2)。
不穩定說明:
假設待排元素序列是:6,4,6,7,2,9,第一次排序后,序列變成了2,4,6,7,6,9,我們可以發現,經過一次排序后,位置一的6調整到位置三的6的后面,所以簡單選擇排序是不穩定的排序。
冒泡排序
基本思想:
從待排序元素的倒數第一位開始向前遍歷,如果當前元素比前面元素小,則交換位置。這樣一次遍歷下來,最小的元素冒泡到第一個位置了,然后,從倒數第二位、第三位...開始向前遍歷,重復上面的過程,直到元素有序。
算法實現:
時間復雜度:
冒泡排序是穩定的排序,時間復雜度是O(n^2)
快速排序
基本思想:
選擇一個基準元素(通常選擇第一個元素或者最后一個元素),通過一次排序將待排序列分為兩部分,一部分都比基準元素小,另一部分都比基準元素大,然后再按此方法對這兩組數據分別進行快速排序,直到待排序列有序。
算法實現:
時間復雜度:
快速排序是不穩定排序,時間復雜度是O(nlogn)
堆排序
基本思想:
堆的概念:
n個元素的序列{k1,k2,…,kn}當且僅當滿足下列關系之一時,稱之為堆。
情形1:ki <= k2i 且ki <= k2i+1 (最小堆)
情形2:ki >= k2i 且ki >= k2i+1 (最大堆)
其中i=1,2,…,n/2向下取整;
堆排序:
把待排序的序列看作是一棵順序存儲的二叉樹,調整它們的存儲順序,使之成為一個最大堆,這時堆的根節點數最大。然后,將根節點與堆的最后一個節點交換,并對前面n-1個數重新調整使之成為堆,依此類推,最后得到有n個節點的有序序列。
從算法描述來看,堆排序需要兩個過程,一是建立堆,二是堆結果。
說明:若想得到升序序列,則建立最大堆,若想得到降序序列,則建立最小堆。
算法實現:
時間復雜度:
堆排序是不穩定的排序,其時間復雜度是O(nlogn)。
歸并排序
基本思想:
是把待排序序列分為若干個子序列,每個子序列是有序的,然后再把有序子序列合并為整體有序序列。
算法實現:
時間復雜度:
歸并排序是穩定的排序,其時間復雜度為O(nlogn)。
字基數排序
基本思想:
將所有待排序列(正整數)統一為同樣的數位長度,數位較短的數前面補零。然后 ,從最低位開始,依次進行一次排序。這樣,從最低位一直到最高位排序完成以后, 數列就變成一個有序序列。
算法實現:
時間復雜度:
基數排序是穩定的排序,其時間復雜度為O(d(n+r)),d為位數,r為基數范圍。






