算法導論讀書筆記(8)線性時間排序

第二部分 排序和順序統計量

第8章 線性時間排序

2. 計數排序

  • 基本思想:對每一個輸入元素x,確定小於x的元素個數,利用這一信息,將x放到它在輸出數組中的位置上。如,有17個元素小於x,則x就應該在第18個輸出位置上。
  • 時間複雜度 Θ(n)
  • 假設輸入數據都屬於一個小區間內的整數
  • 重要性質: 穩定(具有相同值的元素在輸出數組中的相對次序與輸入數組中的相對次序相同)
    這裏寫圖片描述
Counting-Sort(A, B, k)
    let C[0..k] be a new array
    for i = 0 to k
        C[i] = 0
    for j = 1 to A.length
        C[A[j]] = C[A[j]] + 1
    // C[i] now contains the number of elements equal to i.
    for i = 1 to k
        C[i] = C[i] + C[i-1]
    // C[i] now contains the number of elements less than or equal to i.
    for j = A.length downto 1
        B[C[A[j]]] = A[j]
        C[A[j]] = C[A[j]] - 1

3. 基數排序

  • 先按最低有效位進行排序
  • 具有線性的時間代價
  • 不是 原址排序
  • 快速排序可以比基數排序更有效地使用硬件的緩存
    這裏寫圖片描述

4. 桶排序

  • 假設輸入是由一個隨機過程產生,該過程將元素均勻、獨立地分佈
  • 先對每個桶中的數進行排序,然後遍歷每個桶,按照次序把只個桶中的元素列出
  • 時間複雜度 Θ(n)
Bucket-Sort(A)
    n = A.length
    let B[0..n-1] be a new array
    for i = 0 to n - 1
        make B[i] an empty list
    for i = 1 to n
        insert A[i] into list  B[⌊nA[i]⌋]
    for i = 0 to n - 1
        sort list B[i] with insertion sort
    concatenate the list B[0], B[1], ... B[n-1] together in order
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章