面試Java中的基本排序算法

(ps:排序算法是基本功,因此筆試/面試很容易被考到,這裏只對排序算法進行基本闡述,沒有書寫代碼,相關代碼百度百科)
穩定性:穩定排序算法會讓原本相等的鍵值的記錄維持相對次序。也就是說如果一個排序算法是穩定的,當有兩個相等的鍵值記錄R與S,且在原本的列表中R出現在S之前,在排序過的列表中R也將會在S之前。
不穩定排序:

排序名稱 排序的平均時間複雜度
選擇排序(selection sort) O(n^2)
快速排序(quick sort) O(nlogn)
希爾排序(shell sort) 根據步長序列的不同而不同
堆排序(heap sort) O(nlogn)
基數排序(radix sort) O(k* n)(k決定了進行多少輪處理,n是每輪處理的位數)

穩定的排序:

排序名稱 排序的平均時間複雜度
插入排序(insertion sort) O(n^2)
冒泡排序(bubble sort) O(n^2)
歸併排序(merge sort) O(nlogn)
二叉樹排序(binary tree sort) O(nlogn)
計數排序(counting sort) O(n+k)(當輸入的元素是n個0~k之間的整數)
桶排序(bucket sort) O(n+k)
  1. 選擇排序(Selection sort):
    核心思想:首先在未排序的序列中找到最大(小)的一個元素,存放在排序序列的起始位置,然後,再從剩下未排序的元素中找到最大(小)元素,放到排序序列的結束位置,以此類推,直到所有元素均排列完成。核心思想是首先在未排序的序列中找到最大(小)的一個元素,存放在排序序列的起始位置,然後,再從剩下未排序的元素中找到最大(小)元素,放到排序序列的結束位置,以此類推,直到所有元素均排列完成。
    優點:與數據移動有關,每完成一次循環就會有一個元素位於正確的位置,如果位於正確位置則不參加數據交換。
    數據結構:數組。
    最壞時間複雜度:O(n^2)
    最優時間複雜度:O(n^2)
    平均時間複雜度:O(n^2)
    最壞空間複雜度:О(n) total, O(1) auxiliary

  2. 快速排序(Quicksort):
    核心思想:採用分治思想,首先從數列中挑出一個元素,作爲基準(pivot),然後將大於基準的元素放在前邊(後邊),小於基準的元素放在後邊(前邊),遞歸地(迭代)把小於基準值的子數列和大於基準值的子數列排序,直到數列大小爲0或1的時候已經排好序了。
    數據結構:不定
    最壞時間複雜度:O(n^2)
    最優時間複雜度:O(nlogn)
    平均時間複雜度:O(nlogn)
    最壞空間複雜度:根據實現的方式不同而不同。

  3. 歸併排序(Merge sort):
    核心思想:就是將兩個已經排序的序列合併成一個序列的操作,有遞歸法,迭代法。遞歸法是申請空間,使其大小爲兩個已經排序序列之和,該空間用來存放合併後的序列;設定兩個指針,最初位置分別爲兩個已經排序序列的起始位置;比較兩個指針所指向的元素,選擇相對小的元素放入到合併空間,並移動指針到下一位置;以此類推直到某一指針到達序列尾;將另一序列剩下的所有元素直接複製到合併序列尾。迭代法是將序列每相鄰兩個數字進行歸併操作,形成 ceil(n/2)個序列,排序後每個序列包含兩/一個元素;若此時序列數不是1個則將上述序列再次歸併,形成 ceil(n/4)個序列,每個序列包含四/三個元素,依次類推,直到所有元素排序完畢,即序列數爲1。
    數據結構:數組
    最壞時間複雜度:O(nlogn)
    最優時間複雜度:O(nlogn)
    平均時間複雜度:O(nlogn)
    最壞空間複雜度:O(n)

  4. 插入排序(Insertion sort):
    核心思想:從第一個元素開始,該元素可以認爲已經被排序,取出下一個元素,在已經排序的元素中從後向前掃描,如果已經排好序的元素大於新元素,則將該元素移到下一個位置,以此類推,直到找到已排序的元素小於或者等於新元素的位置,將該元素插入該位置後,重複上述步驟,直到沒有元素可取。
    數據結構:數組
    最壞時間複雜度:O(n^2)
    最優時間複雜度:O(n^2)
    平均時間複雜度:O(n^2)
    最壞空間複雜度:一共O(n),需要輔助空間O(1)

  5. 希爾排序(shell sort):
    核心思想:通過將比較的全部元素分爲幾個區域來提升插入排序的性能,首先設定一個初始步長,根據排序數列按步長分組,對每一列進行插入排序,縮減步長,再次插入排序,最後以1步長進行排序
    數據結構:數組
    最壞時間複雜度:根據步長序列不同而不同
    最優時間複雜度:O(n)
    平均時間複雜度:根據步長序列不同而不同
    最壞空間複雜度:O(n)

  6. 堆排序(heapsort):
    核心思想:是指利用堆的數據結構所設計的一種排序算法。堆是一個近似完全二叉樹的結構,並同時滿足堆積的性質:即子節點的鍵值或索引總是小於或大於他的父節點,堆中最大值總是位於根節點。堆排序就是取出位於第一個數據的根節點,並做最大堆調整(將堆的末端子節點作調整,使得子節點永遠小於父節點)的遞歸運算。
    數據結構:
    最壞時間複雜度:O(nlogn)
    最優時間複雜度:O(nlogn)
    平均時間複雜度:O(nlogn)
    最壞空間複雜度:O(n)

  7. 基數排序(Radix sort):
    核心思想:將所有比較數值(正整數)統一爲同樣的數字長度,數字較短的數面前補零。從最低位開始依次進行一次排序,這樣從最低位排序一直到最高位排序完成以後,數列就變成了一個有序數列
    數據結構:數組
    最壞時間複雜度:O(kn)
    最壞空間複雜度:O(k+N)

  8. 冒泡排序(Bubble sort):
    核心思想:比較相鄰的元素。如果第一個比第二個大,就進行交換,對每一對相鄰的元素做同樣的工作,只到最後,會將最大數冒出來,以此類推,直到沒有任何一對數字需要比較。
    數據結構:數組
    最壞時間複雜度:O(n^2)
    最優時間複雜度:O(n^2)
    平均時間複雜度:O(n^2)
    最壞空間複雜度:O(n)

  9. 計數排序:
    核心思想:輸入的元素是n個0到K之間的整數由於用來計數的數組C的長度取決於待排序數組中的數據範圍,這使得計數排序對於數據範圍很大的數組,需要大量的時間和內存,首先找出待排序的數組中最大和最小的元素,然後統計數組中每個值爲i的元素出現的次數,存入數組C的第i項,對所有的計數累加從數組的第一個元素開始,每一項和前一項相加,最後反向填充目標數組:將每一個i元素放在新數組的C[i]項,每放一個元素就將C[i]減去1。
    數據結構:數組
    最壞時間複雜度:O(n+k)
    最優時間複雜度:O(n+k)
    平均時間複雜度:O(n+k)
    最壞空間複雜度:O(n+k)

  10. 桶排序(Bucket sort):
    核心思想:將數組分到有限數量的桶裏,每個桶再個別排序,首先設置一個定量的數組當作空桶子,尋訪序列,並將項目一個一個放到對應的桶子去。對每個不是空的桶子進行排序。從不是空的桶子裏把項目再放回原來的序列中也就是將所有桶的排序結果合併起來。要求數據的長度必須完全一樣
    數據結構:數組
    最壞時間複雜度:O(n^2)
    最優時間複雜度:O(n)(要排序的數組內的數值均勻分配的時候)
    平均時間複雜度:O(n+k)
    最壞空間複雜度: O(n*k)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章