可以看看大佬的部落格,講解很好,部落格
這裡同時也是第一種建堆的方式,也就是有乙個已知序列然後進行建堆。
//堆排序 公升序採用大頂堆,降序採用小頂堆
#include
using
namespace std;
int a[
500001];
void
adjust
(int v,
int n)
else}}
void
slove
(int n)
for(
int i=n; i>
1; i--
)//每次把a[1]也就是最大的元素放到陣列最後,
}int
main()
slove
(n);
for(
int i=
1; i<=n; i++
) cout << a[i]
<<
" ";
return0;
}
接下來就是沒有已知序列,通過不斷地插入元素來擴充堆,兩種方式建出來的堆是不一樣的,不信的可以試一下, 這個集合建小頂堆後結果就是不一樣的。對於第乙個來說時間複雜度為o(n),這個時間複雜度為o(nlogn)。這裡就放直接可執行的**了,如果想嘗試上面的例子,別忘記把上面**建堆改為建小頂堆。
#include
using
namespace std;
int a[
500001];
void
adjust
(int v)
else}}
intmain()
}return0;
}
三種排序方式和折半查詢
基本思想 每一步將乙個待排序元素按照其關鍵字值的大小插入到已排序序列的合適位置上,知道待排序元素插入完為止。基本思想 每一輪從待排序序列中找到乙個最值 最大或者最小 然後將其和第i個位置的元素交換。templatevoid my swap t a,t b templatevoid bubblesor...
堆排序(遞迴 迭代三種寫法)
具體的演算法流程可以參考 排序演算法 三 之堆排序 堆排序的基本思路 這裡重點討論下調整堆結構這個操作,這個結構是建立在大頂堆已經建立的基礎上的,有遞迴和迭代兩種方法。遞迴方法 public void heapify int arr,int n,int i 非遞迴方法 public void adj...
第三種堆排序 原地堆排序 Java版
實現堆排序 原地堆排序 堆適用於動態資料的維護,不適合系統級的排序 時間複雜度o nlogn 從小到大排序,前兩種堆排序均開闢了額外空間 不需開闢額外空間,也不需為額外空間進行處理,所以,空間複雜度為o 1 根節點從0開始,左孩子 2i 1,右孩子2i 2 public class heapsort...