堆排序 通過最大堆實現 C語言

2021-08-21 06:51:20 字數 1576 閱讀 2689

堆排序實際上是利用了完全二叉樹的公式化描述特性,將乙個陣列以最大堆的方式呈現,並逐一刪除其根節點。

幾個概念要理解:

假設完全二叉樹中一元素的序號為i,1 <= i <= n,則以下關係成立:

1. 當i=1時,該元素為二叉樹的根。若i>1,則該元素父節點的編號為i/2(int取整);

2. 當2i>n時,該元素無左孩子,否則,其左孩子的編號為2i;

3. 當2i+1>n時,該元素無右孩子 ,否則,其右孩子的編號為2i+1。

最大樹:每個節點的值都大於或等於其子節點值的樹。

最大堆:完全二叉樹 && 最大樹。

maxheap.c:

#include #include #include #define ret_true  0

#define ret_false -1

struct maxheap ;

static struct maxheap * maxheap_init(int size);

static void maxheap_destroy(struct maxheap **heap);

static int maxheap_insert(struct maxheap *heap, int ele);

static int maxheap_delete_max(struct maxheap *heap, int *ret_ele);

static void swap_int(int *a, int *b)

static struct maxheap * maxheap_init(int size)

memset(heap->data, 0, size * sizeof(int));

heap->total_size = size;

heap->cur_size = 0;

return heap;

}static void maxheap_destroy(struct maxheap **heap)

free(m_heap);

m_heap = null; }}

static int maxheap_insert(struct maxheap *heap, int ele)

} return ret_true;

}static int maxheap_delete_max(struct maxheap *heap, int *ret_ele)

else if(heap->data[right_i-1] > heap->data[i-1]

&& heap->data[right_i-1] > heap->data[left_i-1])

} else

i++;

left_i = 2*i; /* 根據完全二叉樹的特性尋找左/右子節點 */

right_i = 2*i+1;

} return ret_true;

}static void print_max_heap(struct maxheap *heap)

}int main()

printf("\n");

return 0;

}

最大堆實現堆排序

堆排序 這裡使用的是最大堆 思想 1 將當前的堆轉換成最大堆 從最大的非葉子結點開始,1 判斷根結點和左右結點的大小交換相互的位置,使得該子樹成為最大堆,每次交換成功後就繼續往該結點的子結點去重複 1 操作,直到根結點後再去下乙個非葉子結點,直到根結點 2 轉成最大堆後,每次就將第乙個結點互最後乙個...

最大堆排序 C

堆排序是一種複雜度為o nlog n 的一種高效的排序,這裡將展示最大堆的排序演算法。堆排序是將陣列抽象化成為乙個完全二叉樹。這裡對 a 10 抽象的二叉樹結構如下 1 下面三個節點是得到左子節點,右子節點,和父節點。intleft inti 返回左兒子 intright inti 返回右兒子 in...

C 堆排序 建立最大堆類實現堆排序

class maxheap 建立新陣列 int temp newint newlength 複製 for int index 1 index oldlength index delete old old temp public maxheap int capacity 10 插入元素 void pu...