堆排序原理:
堆排序指的是將大堆(小堆)堆頂(即下標為0)元素與堆的最後乙個(即下標為hp->size - 1)元素交換,hp->size–,將其餘的元素再次調整成大堆(小堆),再次將堆頂(即下標為0)元素與堆的最後乙個(即下標為hp->size - 1)元素交換,hp->size–,將其餘的元素再次調整成大堆(小堆)…………重複上述步驟,直至hp->size<1,將hp->size恢復為原來的值,迴圈不在繼續。
關於公升序或者降序應該建立什麼堆???
排公升序:
若想排公升序即最大值應該在最後面,根據堆排序原理,應該建大堆,這樣將堆頂元素與最後乙個元素交換之後,最大值換到了最後面。
排降序:
若想排降序即最小值應該在最後面,根據堆排序原理,應該建小堆,這樣將堆頂元素與最後乙個元素交換之後,最小值換到了最後面。
堆的詳細概念以及建立等操作
****實現: **
#include
#include
#include
#include
typedef
struct heap
heap;
//堆排序
void
heap_sort
(int
*array,
int size);//
void
swap
(int
*x,int
*y)void
adjustheap
(heap *hp,
int parent)
//如果孩子中的最大值比父母大,則交換
if(hp->data[child]
>hp->data[parent]
)else
return;}
}//建立堆
void
creatheap
(heap *hp,
int*array,
int size)
//先將陣列中的元素拷貝至堆中
memcpy
(hp->data, array, size*
sizeof
(int))
;//向下調整堆
hp->size = size;
root =
(hp->size -2)
/2;for
(; root >=
0; root--)}
//排序
void
heapsort
(heap *hp)
hp->size = size;
}//堆排序
void
heap_sort
(int
*array,
int size)
測試檔案:
#include
"sort.h"
void
testheapsort()
;printf
("排序前:");
//列印
print
(array,
sizeof
(array)
/sizeof
(array[0]
));//堆排序
heap_sort
(array,
sizeof
(array)
/sizeof
(array[0]
));printf
("排序後:");
//列印
print
(array,
sizeof
(array)
/sizeof
(array[0]
));}
intmain()
時間複雜度:o(nlogn)
空間複雜度:o(1)
穩定性:不穩定
堆排序演算法及實現
使用陣列來模擬堆。由於是乙個滿二叉樹 左孩子使用nums 2i 1 模擬 右孩子使用nums 2i 2 模擬 堆排序的基本思路為 a.將無需序列構建成乙個堆,根據公升序降序需求選擇大頂堆或小頂堆 b.將堆頂元素與末尾元素交換,將最大元素 沉 到陣列末端 c.重新調整結構,使其滿足堆定義,然後繼續交換...
c語言 實現堆排序演算法
今天在 演算法導論 第二版看完了 堆排序 演算法,就順便用c語言實現了一下。堆排序演算法的核心思想,使用一種二叉堆的資料結構來儲存資料,其中二叉堆 最小二叉堆 的主要性質為 1 父節點小於所有的子節點的數值 注 最小堆 2 二叉堆為滿二叉樹 其中堆排序演算法,主要包括一下幾個主要的部分 1 保持堆特...
堆排序及C 實現
1.使用其中一種堆結構,二叉堆也可以實現排序。背景 1 完全二叉樹 若設二叉樹的高度為h,除第 h 層外,其它各層 1 h 1 的結點數都達到最大個數,第h層有 葉子結點,並且葉子結點都是從左到右依次排布,這就是 完全二叉樹。二叉堆使用完全二叉樹的結構實現 2 滿二叉樹 除了葉結點外每乙個結點都有左...