对于堆排序,其实就是一个路径上的冒泡的过程,所以可以用这个思想去写代码,
思路:每次父节点都和他的左子树和右子树比较,三者中最大的那个与父节点交换位置,这样递归之后根节点存放的就是该次遍历最大的值,之后将根节点与最后的节点交换,在进行查找(0~(lenth-1))中的最大值与倒数第二个交换位置就OK了。这样自己比较好理解。
1 #include <iostream> 2 using namespace std; 3 4 void swap(int &a, int &b){ 5 int tmp = a; 6 a = b; 7 b = tmp; 8 } 9 10 int findmax(int a[],int lenth,int i){ 11 //找到第i个节点所代表的子树中的最大值 12 if(2*(i) >= lenth) return a[i]; 13 int left, right,max; 14 int rightmax,leftmax; 15 rightmax = leftmax = max =0; 16 right = 2*i+1; 17 left = 2*i; 18 if(i == 0){ 19 right = 2; 20 left = 1; 21 } 22 leftmax = findmax(a,lenth,left); 23 if(right < lenth){ 24 rightmax = findmax(a,lenth,right); 25 } 26 if(leftmax > rightmax && leftmax > a[i])swap(a[i],a[left]); 27 if(rightmax > leftmax && rightmax > a[i])swap(a[i],a[right]); 28 return a[i]; 29 } 30 31 int* heapSort(int a[], int lenth){ 32 int max; 33 for(int i = 0; i < lenth; i++){ 34 max = findmax(a, lenth-i, 0); 35 swap(a[0], a[lenth-i-1]); 36 } 37 return a; 38 }