1 /* 2 *@list:待排序数组 3 *@root:根结点下标 4 *@n:总排序元素个数 5 */ 6 void adjust(element list[], int root, int n)//调整最大堆方法一 7 { 8 int child=2*root+1;//左孩子 9 element temp; 10 while(child < n)//***while*** 11 { 12 if(child < n-1 && list[child]<list[child+1])//比较左右结点,得到较大的为child 13 { 14 //注意child < n-1 15 child++; 16 } 17 18 if(list[root] > list[child])//比较父节点与较大子节点child 19 { 20 break; 21 } 22 else{ 23 /*交换父子节点*/ 24 temp = list[root]; 25 list[root]=list[child]; 26 list[child]=temp; 27 28 /*继续向下,特别要注意这里的*/ 29 root=child; 30 child = 2*child +1; 31 } 32 } 33 } 34 void adjust2(element list[], int root, int n)//调整最大堆方法二 35 { 36 int child=2*root+1;//左孩子 37 38 element rootkey=list[root];//标记最初根节点结点 39 40 while(child < n)//***while*** 41 { 42 if(child < n-1 && list[child]<list[child+1]) 43 { 44 child++;//比较左右结点,得到较大的为child 45 } 46 47 if(rootkey > list[child])//比较最初根节点结点 与 此时的最大子结点 48 { 49 break; 50 } 51 else{ 52 //这里不是交换父子结点,和insertSort思想类似 53 list[root]=list[child];//父节点等于较大孩子结点 54 55 //分别向下移动 56 root=child; 57 child = 2*child +1; 58 } 59 } 60 list[root]=rootkey;//找到最初根结点的合适位置 61 } 62 63 /* 64 *@list:待排序数组 65 *@n:总排序元素个数 66 */ 67 void heapsort(element list[],int n)//堆排序 68 { 69 int i; 70 element temp; 71 72 /*初始化得到最大堆*/ 73 for(i=n/2;i>=0;i--) //从n/2处依次向前调整 74 adjust(list,i,n); //或者采用 adjust2 75 76 for(i=n-1;i>0;i--)//i为剩余规模 77 { 78 temp=list[i]; //交换根结点和i结点 79 list[i]=list[0]; 80 list[0]=temp; 81 //或者采用 adjust2 82 adjust(list,0,i);//重新调整,此时参数root为0,规模n为i 83 } 84 }
转载于:https://www.cnblogs.com/zjhnl/archive/2012/07/16/2593124.html