heapsort代码

来源:互联网 发布:小说人物起名软件 编辑:程序博客网 时间:2024/04/28 16:29

好吧,这次认真看算法导论,正确把每道基础题做会!

堆排序的原理:

1、可以是数组形式,但要注意二叉树本身的特点;

2、首先建立最大堆的时候,要注意可以从第一个非叶子节点开始保持堆的性质;因为叶子节点本身就是单节点的最大堆;非叶节点才需要check是否是最大堆。

3、最后利用最大堆的性质,根节点一定是最大的,不断地把根节点与最右叶节点交换位置,然后再保持堆性质,这样迭代就不断地把局部最大有序地放到了最后,这样就完成了排序。

最后不得不说写这种算法题,利用宏还是不错的选择。我是不是转C编程的节奏。大笑

#include <iostream>#define Parent(i) (i)/2#define LeftChild(i) 2*(i)+1#define RightChild(i) 2*(i)+2void Exchange(int& a,int& b){int temp = a;a = b;b = temp;}void PrintArr(int* array, int size){for (int i = 0; i < size; ++i){printf("%d ", array[i]);}printf("\n");}void MaxHeapify(int* array,const int heapSize, int index){if (index >= heapSize){return;}int left = LeftChild(index);if (left >= heapSize){return;}int maxVal = array[left];int maxIndex = left;int right = RightChild(index);if (right < heapSize && array[right] > array[left]){maxVal = array[right];maxIndex = right;}if (array[maxIndex] > array[index]){Exchange(array[maxIndex], array[index]);}else{maxIndex = index;}if (maxIndex != index){MaxHeapify(array, heapSize, maxIndex);}}void BuildHeap(int* array, int heapSize){for (int i = heapSize/2; i >= 0; --i){MaxHeapify(array, heapSize, i);}}void HeapSort(int* array, const int heapSize){BuildHeap(array, heapSize);for (int i = heapSize; i > 0; --i){Exchange(array[i-1], array[0]);MaxHeapify(array, i-1, 0);}}int main(){int array[] = {1,1001,34,56,12,-99,10922,-1111};const int heapSize = sizeof(array)/sizeof(*array);HeapSort(array, heapSize);PrintArr(array, heapSize);} 


0 0
原创粉丝点击