堆排序
①了解二叉堆的定义
②一般用数组表示堆 注意逻辑存储结构和实际存储结构
③i节点的
父节点(i-1)/2 子节点 左2*i+1 右2*i+2
④注意每种操作的思想
⑤一般数组要堆化操作后再进行堆排序
代码实现
/*本栗子是最小堆*//*从第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*/ } }
时间: 2024-10-25 08:30:32