堆排序及C 實現

2021-06-25 11:20:04 字數 1982 閱讀 6103

1. 使用其中一種堆結構, 二叉堆也可以實現排序。

背景:(1)

完全二叉樹——若設二叉樹的高度為h,除第 h 層外,其它各層 (1~h-1) 的結點數都達到最大個數,第h層有

葉子結點,並且葉子結點都是從左到右依次排布,這就是

完全二叉樹。(二叉堆使用完全二叉樹的結構實現)

(2) 滿二叉樹——除了葉結點外每乙個結點都有左右子葉且葉子結點都處在最底層的二叉樹。

本文主要使用c++實現了小根和大根二叉堆,

時間複雜度為

• 向上調整

/向下調整 –

每層是常數級別, 共

logn層,

因此o(

logn)

• 插入/刪除

–只呼叫一次向上或向下調整

, 因此都是

o(logn)

• 建堆 –

高度為h的結點有n/2

h+1個

,總時間為

2. c++實現**如下:

#include #include using namespace std;  

const int maxn = 11111;

int n, a[maxn], ans = 0;

//以下兩個是自定義校驗函式,mincmp是小根堆所需要的,而maxcmp就是大根堆所需要的了,

inline bool mincmp(const int &x, const int &y)

inline bool maxcmp(const int &x, const int &y)

//定義,第乙個關鍵字為堆的大小,第二關鍵字為自定義校驗型別

template class heap

inline void clear()

//清空

inline void push(int x)//插入操作,向上調整 ,將最後節點的值即即將插入的值和父節點比較

int hole = n++;//(0-n)

for(; hole > 0 && cmp(x, a[hole >> 1]); hole = hole >> 1)//把這個元素和根節點比較並交換

a[hole] = x;

}inline void heapsort()

printf("the heap is......\n");

h.print();

//printf("from head to child......\n");

printf("from head to child......\n");

h.heapsort();

h.print();

system("pause");

return 0;

}

3. 堆排序的意義

在實踐中,由於堆排序不如快速排序,所以很少被用來進行排序。

她的真正意義在於最快的找到最大值或者最小值。在堆結構中插入乙個值重新構造堆結構,或者當取走乙個值時重新構造堆結構。複雜度為lgn, 即高度值。

所以堆的相關操作常被用於排程演算法中。

//調整節點 大根堆  

templatevoid adjustheapnode(t a,int i,int n)

} }

//建立堆

templatevoid createheap(t a,int n)

} //堆排序

templatevoid heapsort(t a,int n)

}

c 實現堆排序

include include include using namespace std 對比枝節點和左右子節點,將比較大的節點放置於枝節點 template int heapadjust t t,int i,int size if rightchild size t rightchild t max...

C 實現堆排序

堆排序是一種具有合併排序和插入排序共同優點的排序方法。它的時間複雜度為o nlgn 它也是一種原地排序演算法 在任何時候,陣列中只有常數個元素儲存在輸入陣列以外。要介紹堆排序首先要介紹什麼是堆。1.建堆 堆資料結構是一種陣列物件,它可以被視為一顆完全二叉樹,如下圖。右邊陣列表示的堆可以用左邊的完全二...

堆排序(C 實現)

堆排序執行時間 n lgn 它是一種原地 in place 排序演算法 在任何時候,陣列中只有常數個元素儲存在陣列外。堆的資料結構不至少在堆排序中有用,還可以構成乙個有效的優先佇列。二叉堆資料結構是一種陣列物件,它可以被看做是一棵完全二叉樹。樹中的每個節點與陣列中存放該節點值的那個元素對應。除了最後...