/****************** heap sort *****************/ void heapsort(T* arr, int n) { if (arr = nullptr) return; for (int i = n / 2; i >= 0; --i) { // 首先要建立最大堆 perc_down(arr, i, n); } for (int i = n - 1; i > 0; --i) { swap(arr, arr + i); // 将最大值移到数组末尾 perc_down(arr, 0, i - 1); // 现在arr[0]为一个新的值,需要进行下推 } }
void heapsort(TAsoc a[], int n) { int i, j; j = n; for (i=n/2; i>0; i--) /* BuildHeap */ perc_down(a,i,j); i = 1; for (j=n; j>=2; j--) { swapItem(&a[i],&a[j]); /* DeleteMax */ perc_down(a,i,j-1); } }
void delete_min() { min_heap(); a[1]=a[hsize]; hsize--; perc_down(1); }
void perc_down(int i) { int small,l,r; struct node temp; small=i; l=2*i; r=2*i+1; if(l<=hsize) { if(comp(a[l],a[i])==-1) small=l; } if(r<=hsize) { if(comp(a[r],a[small])==-1) small=r; } if(small!=i) { temp=a[i]; a[i]=a[small]; a[small]=temp; perc_down(small); } }