好理解的堆排序

对于堆排序,其实就是一个路径上的冒泡的过程,所以可以用这个思想去写代码,

思路:每次父节点都和他的左子树和右子树比较,三者中最大的那个与父节点交换位置,这样递归之后根节点存放的就是该次遍历最大的值,之后将根节点与最后的节点交换,在进行查找(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 }
艰难的成长
原文地址:https://www.cnblogs.com/marylins/p/3588728.html