堆排序

来源:互联网 发布:楚河汉界刷黄金软件 编辑:程序博客网 时间:2024/06/04 19:22

//堆排序

#include <iostream>

using namespace std;

int heapSize = 0;

//返回左子节点索引

int Left(int index) {

return ((index << 1) + 1);

}

//返回右子节点索引

int Right(int index) {

return ((index << 1) + 2);

}

//交换ab的值

void swap(int *a, int *b) {

int temp = *a;

*a = *b;

*b = temp;

}

//array[index]与其左右子树进行递归对比

//用最大值替换array[index], index表示堆顶索引

void maxHeapify(int array[], int index) {

int largest = 0;//最大数

int left = Left(index);//左子节点索引

int right = Right(index);//右子节点索引

//largest赋为堆顶与其左子节点的较大者

if((left <= heapSize) && (array[left] > array[index]))

largest = left;

else

largest = index;

//largest与堆顶的右子节点比较, 取较大者

if(largest != index) {

//如果堆顶不是最大者, 则交换, 并递归调整堆

swap(&array[index], &array[largest]);

maxHeapify(array, largest);

}

}

//初始化堆, 将数组中的每一个元素置放到适当的位置

//完成之后, 堆顶的元素为数组的最大值

void buildMaxHeap(int array[], int length) {

int i;

heapSize = length;//堆大小赋为数组长度

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

maxHeapify(array, i);

}

void heap_sort(int array[], int length) {

int i;

//初始化堆

buildMaxHeap(array, (length - 1));

for(i = (length - 1); i >= 1; i--) {

swap(&array[0], &array[i]);

//堆顶元素array[0](即数组的最大值)被置换到数组的尾部array[i]

heapSize--; //从堆中移除该元素

maxHeapify(array, 0);//重建堆

}

}

int main(void) {

int a[8] = {45, 68, 20, 39, 88, 97, 46, 59};

heap_sort(a, 8);

int i = 0;

for(i = 0; i < 8; i++) {

cout << a[i] << " ";

}

cout << endl;

return 0;

}

0 0
原创粉丝点击