堆排序

来源:互联网 发布:.bat java 编辑:程序博客网 时间:2024/05/20 07:19

堆排序(Heap Sort)

算法思路:首先将待排序数组构造为大顶堆,大顶堆是一棵完全二叉树,而且每棵子树的根节点都是该子树的最大值。然后将堆顶元素与此时堆的最后一个元素交换,并将堆的规模减一,再构造一个新的大顶堆,循环进行下去直到堆中剩下一个元素为止,此时排序完成。构造大顶堆是通过下滤操作完成的。

堆排序的时间性能上界为O(N*logN)。堆排序是不稳定排序算法。


下面的算法将完全二叉树的每个节点值由上到下,由左到右依次存放在一个数组中。

void Swap( int *a, int *b ){         int Tmp;                 Tmp = *a;         *a = *b;         *b = Tmp;} /*对规模为N的堆中的A[i]进行下滤处理*/void PercDown( int A[], int i, int N ){int maxIndex = i;int left = 2 * i + 1;int right = left + 1;if(left < N && A[left] > A[i])maxIndex = left;if(right < N && A[right] > A[maxIndex])maxIndex = right;if(maxIndex != i) {Swap(&A[i], &A[maxIndex]);PercDown(A, maxIndex, N);}} void HeapSort( int A[], int N ){         int i;                 /*创建大顶堆*/         for(i = N / 2; i >= 0; i-- ){                   PercDown(A, i, N );         }                 /*将堆顶元素与当前堆的最后一个元素交换,并将堆的规模减一,         然后将堆顶元素做下滤处理,产生新的大顶堆*/         for(i = N - 1; i > 0; i--){                   Swap(&A[0], &A[i] );                   PercDown(A, 0, i );         }}

原创粉丝点击