堆排序演算法詳解及實現 c語言

2021-08-28 08:10:25 字數 2015 閱讀 6606

堆排序原理:

堆排序指的是將大堆(小堆)堆頂(即下標為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 滿二叉樹 除了葉結點外每乙個結點都有左...