c 實現堆排序

2021-10-07 17:20:48 字數 1431 閱讀 2425

**說明

**是我親自碼的,除錯通過的,**中有演算法思想和詳細的注釋,一目了然。

專案已經上傳到我的github:

專案中還有另外得九種排序演算法的c++實現**以及其思想。

1 選擇排序:

2 插入排序:

3 氣泡排序:

4 希爾排序:

5.1 歸併排序遞迴實現:

5.2 歸併排序非遞迴實現:

6.1 快速排序遞迴實現:

6.2 快速排序非遞迴實現:

7 堆排序:

8 計數排序:

9 桶排序:

10 基數排序:

術語說明

1、穩定排序:如果 a 原本在 b 的前面,且 a == b,排序之後 a 仍然在 b 的前面,則為穩定排序。

2、非穩定排序:如果 a 原本在 b 的前面,且 a == b,排序之後 a 可能不在 b 的前面,則為非穩定排序。

3、原地排序:原地排序指在排序過程中不申請多餘的儲存空間,只利用原來儲存待排資料的儲存空間進行比較和交換的資料排序。

4、非原地排序:需要利用額外的陣列來輔助排序。

5、時間複雜度:乙個演算法執行所消耗的時間。

6、空間複雜度:執行完乙個演算法所需的記憶體大小。

效能分析

時間複雜度:o(n*log(n))

空間複雜度:o(1)

非穩定的原地排序

void sort::sort_heap(std::vector&data)

// 開始堆排序

for(int i = length -1; i > 0; i--)

} void sort::down_adjust(std::vector&data, int parent, int length)

// 如果parent節點的元素大於子節點的元素,則下沉完成.

if(key >= data.at(child))

// 需要下沉,將child節點放到父節點.

data.at(parent) = data.at(child);

// 更新parent和child,以便繼續下沉操作.

parent = child;

child = 2 * parent +1;

}// 找到下沉位置後將下沉元素放到正確位置上後完成操作.

data.at(parent) = key;

} void sort::up_adjust(std::vector&data, int length)

// 找到上浮位置後,將要上浮的節點放進去.

data.at(child) = key;

}

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