好理解的堆排序
2014-03-08 22:25
225 查看
对于堆排序,其实就是一个路径上的冒泡的过程,所以可以用这个思想去写代码,
思路:每次父节点都和他的左子树和右子树比较,三者中最大的那个与父节点交换位置,这样递归之后根节点存放的就是该次遍历最大的值,之后将根节点与最后的节点交换,在进行查找(0~(lenth-1))中的最大值与倒数第二个交换位置就OK了。这样自己比较好理解。
思路:每次父节点都和他的左子树和右子树比较,三者中最大的那个与父节点交换位置,这样递归之后根节点存放的就是该次遍历最大的值,之后将根节点与最后的节点交换,在进行查找(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; }