基本排序演算法 之七 堆排序

2021-09-23 07:58:03 字數 1077 閱讀 8387

首先放遞迴的版本,因為遞迴版本更容易理解過程。

堆排序實際是把數列看成一顆完全二叉樹,而不是真的去用 指標結構體 構造一顆二叉樹。數列在堆中從上到下,從左至右依次排成一棵樹。

下面是遞迴版本的**

//用來調整節點,保證節點大於左右孩子

templatevoid adjustnode(t arr, int node, int len)

else

} }else }}

//調整樹中所有的節點

templatevoid adjustheep(t arr, int len)

}templatevoid heapsort(t arr, int lo, int hi)

std::swap(arr[lo], arr[hi - 1]); //最後一次調整了,還沒有交換; 交換了就不需要再調整了,所以放到迴圈外

}

上述遞迴版本的adjustnode()函式中邏輯判斷雖然明顯易讀,但是判斷多餘冗餘;另外,迭代版本 效率 一般低於迭代版本。下面給出迭代版本的**。

//用來調整節點,保證節點大於左右孩子

templatevoid adjustnode(t arr, int node, int len)

if (arr[lchnode] > arr[node])

else break; //沒有交換了就跳出

}}//調整樹中所有的節點

templatevoid adjustheep(t arr, int len)

}templatevoid heapsort(t arr, int lo, int hi)

std::swap(arr[lo], arr[hi - 1]); //最後一次調整了,還沒有交換; 交換了就不需要再調整了,所以放到迴圈外

}

堆排序的時間複雜度:初始的n/2次調整節點 + (n - 1)次 從堆頂開始的 從上往下的log2n次調整 = n/2 + (n-1)log2n = nlog2n;所以時間複雜度為o(nlogn)。顯然,堆排序的常數時間較大,所以堆排序速度比快排要慢。另外,堆排序為不穩定的排序方法。

排序演算法 七 堆排序

1.1 什麼是堆 要理解堆排序,首先要先理解什麼是堆。堆是一顆順序儲存的完全二叉樹,堆又分為最大堆和最小堆。根據上面的描述我們可以用乙個數學描述來定義最大最小堆 對於陣列 d 0 d 1 d n 當且僅當滿足下列關係時稱之為堆 舉個栗子 3,4,7,12,15,18 就是乙個典型的最小堆,i 2。1...

排序演算法之七 堆排序 Heap Sort

堆排序 heapsort 是指利用堆這種資料結構所設計的一種排序演算法。堆積是乙個近似完全二叉樹的結構,並同時滿足堆積的性質 即子結點的鍵值或索引總是小於 或者大於 它的父節點。將待排序的元素序列 r1,r2 rn 構建成最大堆,此堆為初始的無序區。關於最大堆的詳細構建過程請點這裡 將最大堆的堆頂元...

排序七 堆排序

時間複雜度 最好 o n o n 平均o n o nlogn 最差o n o nlogn 空間複雜度 o n o 1 穩定性 不穩定 堆 順序儲存的完全二叉樹,其每個結點均小於等於或大於等於其子節點。小根堆 每個結點元素的值都小於等於其子節點元素的值的堆。s i s 2 i 1 s i s 2 i ...