您的位置:首页 > 其它

好理解的堆排序

2014-03-08 22:25 225 查看
对于堆排序,其实就是一个路径上的冒泡的过程,所以可以用这个思想去写代码,

思路:每次父节点都和他的左子树和右子树比较,三者中最大的那个与父节点交换位置,这样递归之后根节点存放的就是该次遍历最大的值,之后将根节点与最后的节点交换,在进行查找(0~(lenth-1))中的最大值与倒数第二个交换位置就OK了。这样自己比较好理解。

#include <iostream>
using namespace std;

void swap(int &a, int &b){
int tmp = a;
a = b;
b = tmp;
}

int findmax(int a[],int lenth,int i){
//找到第i个节点所代表的子树中的最大值
if(2*(i) >= lenth) return a[i];
int left, right,max;
int rightmax,leftmax;
rightmax = leftmax = max =0;
right = 2*i+1;
left = 2*i;
if(i == 0){
right = 2;
left = 1;
}
leftmax = findmax(a,lenth,left);
if(right < lenth){
rightmax = findmax(a,lenth,right);
}
if(leftmax > rightmax && leftmax > a[i])swap(a[i],a[left]);
if(rightmax > leftmax && rightmax > a[i])swap(a[i],a[right]);
return a[i];
}

int* heapSort(int a[], int lenth){
int max;
for(int i = 0; i < lenth; i++){
max = findmax(a, lenth-i, 0);
swap(a[0], a[lenth-i-1]);
}
return a;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: