您的位置:首页 > 其它

排序算法-堆排序

2013-03-12 17:24 211 查看
堆排序(HeapSort)

堆排序主要是利用了数据结构堆的相关性质来进行排序操作。简单来说,堆的结构图类似于二叉树,有两种堆,最大值堆和最小值堆,在最大值堆中,堆的每一个节点的值,都大于该节点的两个子节点(left,right)的值,所以,根节点的值最大,类似最小值堆则相反。

代码如下:

void HeapSort(int *A, int n){
BulidMaxHeap(A,n);
for(int i = n-1; i>=1; i--){
Exchange(A[0],A[i]);
heapsize[A]--;
MaxHeapify(A, 0);
}
}

void BuildMaxHeap(int *A){
for(int i = heapsize[A]/2; i>=0; i--){
MaxHeapify(A, i);
}
}

void MaxHeapify(int *A, int k){
int l = k*2;
int r = k*2 + 1;
int largest;
if(l < heapsize[A]  && A[l] > A[k]){
largest = l;
}else{
largest = k;
}
if(r < heapsize[A] && A[largest] < A[r]){
largest = r;
}
if(largest != k){
Exchange(A[largest], A[k]);
MaxHeapify(A, largest);
}
}

void Exchange(int &i, int &j){
i = i + j;
j = i - j;
i = i - j;
}


代码中主要有3个函数HeapSort,BuildMaxHeap,MaxHeapify。

1.MaxHeapify(int *A, int k)

该函数主要功能:检测堆A中的第k个元素A[k]是否满足最大值堆的性质(父节点A[k]大于子节点),如果不满足则进行调整至所有节点均满足该性质为止。

2.BuildMaxHeap(int *A)

该函数主要功能:简历一个最大值堆

3.HeapSort(int *A, int n)

该函数主要功能:对一个最大值堆进行排序,大致过程:首先将堆的根节点和最后一个节点交换,这样根节点就破换了最大值堆的性质,然后对交换后的堆的根节点进行调整MaxHeapify(A, 0);依次调用该过程。

由于每次交换值的时候根节点是堆的最大值,所以第一次调整是将堆的最大值放到数组的最后,第二次调整时将堆的第二大值放到数组的倒数第二的位置,以此类推。

代码中heapsize[A] 代表的是堆的长度,每交换一次值后,堆的长度减一。

P.S:

以上代码为伪代码,其中heapsize[A]的操作没用定义。要将代码移植到C/C++平台上,可以将heapsize定义为全局变量,或者多为数组A开辟一个空间,用来存放heapsize。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: