标签:int 算法 子节点 开始 log 堆排 父节点 amp 代码
堆排序
/*本栗子是最小堆*/
/*从第i个节开始调整*/ void MinHeapDown(int a[],int i,int n) { int j=0,temp=0; temp = a[i]; j=2*i+1;/*i节点的左孩子*/ while(j < n) { if(j+1<n && a[j+1]<a[j])/*在左右孩子中找最小的来替换父节点i*/ j++; if(a[j] >= temp)/*父节点小于任何一个孩子*/ break; a[i] = a[j];/*将较小的节点往上移,替换父节点*/ i = j; j = 2*i+1; } a[i] = temp; } /*由于堆也是用数组模拟的,故堆化数组后,第一次将A[0]与A[n - 1]交换,再对A[0…n-2]重新恢复堆。 第二次将A[0]与A[n – 2]交换,再对A[0…n - 3]重新恢复堆,重复这样的操作直到A[0]与A[1]交换。 由于每次都是将最小的数据并入到后面的有序区间,故操作完成后整个数组就有序了*/ void HeapSort(int a[],int n) { int i=0; for(i=n/2-1;i>=0;i--)/*堆化数组(最小堆)*/ MinHeapDown(a,i,n); for(i=n-1;i>0;i--) { Swap(a[0],a[i]);/*将最小的数调到最后 循环一次后相当于删除了排在最后的最小值*/ MinHeapDown(a,0,i);/*从根节点0从上往下调整到i*/ } }
标签:int 算法 子节点 开始 log 堆排 父节点 amp 代码
原文地址:http://www.cnblogs.com/myworld7/p/7291936.html