排序算法-堆排序
2013-03-12 17:24
211 查看
堆排序(HeapSort)
堆排序主要是利用了数据结构堆的相关性质来进行排序操作。简单来说,堆的结构图类似于二叉树,有两种堆,最大值堆和最小值堆,在最大值堆中,堆的每一个节点的值,都大于该节点的两个子节点(left,right)的值,所以,根节点的值最大,类似最小值堆则相反。
代码如下:
代码中主要有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。
堆排序主要是利用了数据结构堆的相关性质来进行排序操作。简单来说,堆的结构图类似于二叉树,有两种堆,最大值堆和最小值堆,在最大值堆中,堆的每一个节点的值,都大于该节点的两个子节点(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。
相关文章推荐
- 【排序算法】:堆排序
- 数据结构和算法分析之排序算法--选择排序(堆排序)
- 五种经典排序算法的实现(冒泡、归并、快排、堆排序、希尔)
- [算法学习笔记]排序算法——堆排序
- 排序算法之堆排序
- Java排序算法(五):堆排序
- 排序算法_3,堆排序
- Java排序算法--堆排序(HeapSort)
- 排序算法--堆排序
- 几种常用的排序算法(快速排序,希尔排序,堆排序,选择排序,冒泡排序)
- 排序算法java版,速度排行:冒泡排序、简单选择排序、直接插入排序、折半插入排序、希尔排序、堆排序、归并排序、快速排序
- 排序算法(七)——堆排序
- 排序算法-堆排序
- 各排序算法总结(简单选择,冒泡,快速,希尔排序,堆排序)
- 排序算法——堆排序
- 经典排序算法:堆排序(python)
- 关于几种排序算法(简易冒泡,正宗冒泡,选择,插入,快速,希尔,堆排序)
- 排序算法之堆排序
- 排序算法之堆和堆排序
- 排序算法进阶-堆排序