#include <stdio.h>
#include <stdlib.h>
/*
MAX-HEAPIFY(A, i) //保持最大堆
1 l ← LEFT(i)
2 r ← RIGHT(i)
3 if l ≤ heap-size[A] and A[l] > A[i]
4 then largest ← l
5 else largest ← i
6 if r ≤ heap-size[A] and A[r] > A[largest]
7 then largest ← r
8 if largest ≠ i
9 then exchange A[i] <-> A[largest]
10 MAX-HEAPIFY(A, largest)
*/
void maxheap(int A[], int len, int i)
{
int l = 2*i+1;
int r = 2*i+2;
int largest = i;
if(l < len && A[l] > A[i])
largest = l;
else
largest = i;
if(r < len && A[r] > A[largest])
largest = r;
if (largest != i){
int tmp = A[largest];
A[largest] = A[i];
A[i] = tmp;
maxheap(A, len, largest);
}
}
void minheap(int A[], int len, int i)
{
int l = 2*i+1;
int r = 2*i+2;
int smallest = i;
if(l < len && A[l] < A[i])
smallest = l;
else
smallest = i;
if(r < len && A[r] < A[smallest])
smallest = r;
if (smallest != i){
int tmp = A[smallest];
A[smallest] = A[i];
A[i] = tmp;
minheap(A, len, smallest);
}
}
/*
BUILD-MAX-HEAP(A) //建堆
1 heap-size[A] ← length[A]
2 for i ← |_length[A]/2_| downto 1
3 do MAX-HEAPIFY(A, i)
*/
void buildheap(int A[], int len)
{
int heapsize = len;
for(int i = len/2-1; i >=0; i--)
//maxheap(A,len,i);
minheap(A,len,i);
}
/*
HEAPSORT(A) //n-1次调用MAX-HEAPIFY,所以,O(n*lgn)
1 BUILD-MAX-HEAP(A) //建最大堆,O(n)
2 for i ← length[A] downto 2
3 do exchange A[1] <-> A[i]
4 heap-size[A] ← heap-size[A] - 1
5 MAX-HEAPIFY(A, 1) //保持堆的性质,O(lgn)
*/
void heapsort(int A[], int len)
{
buildheap(A,len);
for(int i = len-1; i>=1; i--){
int tmp = A[0];
A[0] = A[i];
A[i] = tmp;
len = len-1;
minheap(A,len,0);
}
}
int main()
{
int A[] = {1,5,4,7,9,2,3,6,8};
int len = sizeof(A)/sizeof(A[0]);
for(int i = 0; i < len ; i++)
printf("%d ", A[i]);
printf("\n");
//buildheap(A,len);
heapsort(A,len);
for(int i = 0; i < len ; i++)
printf("%d ", A[i]);
printf("\n");
return 1;
}
HEAP SORT
©著作权归作者所有,转载或内容合作请联系作者
- 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
- 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
- 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
推荐阅读更多精彩内容
- 堆排序是一种树形选择排序,是对直接选择排序的有效改进。 基本思想: 堆顶元素(即第一个元素)必为最小项(小顶堆)或...
- 堆排序算法,基于选择排序的思想,利用堆结构的性质来完成对数据的排序。 前提准备: 什么是堆结构:堆数据结构是一种数...