#include <stdio.h>
void Swap(int arr[], int m, int n)
{
if (m == n) return;
arr[m] += arr[n];
arr[n] = arr[m] - arr[n];
arr[m] = arr[m] - arr[n];
}
int Max(int a, int b, int c)
{
if (a >= b)
{
if (a >= c) return a;
else return c;
}
else
{
if (b >= c) return b;
else return c;
}
}
void HeapAdjust(int arr[], int s, int e)
{
int left = s * 2 + 1;
int right = left + 1;
if (left > e) return;
else if (right > e)
{
if (arr[s] >= arr[left]) return;
else
{
Swap(arr, s, left);
HeapAdjust(arr, left, e);
}
}
else
{
int i = Max(arr[s], arr[left], arr[right]);
if (i == arr[s])
return;
else if (i == arr[left])
{
Swap(arr, s, left);
HeapAdjust(arr, left, e);
}
else
{
Swap(arr, s, right);
HeapAdjust(arr, right, e);
}
}
}
void BuildHeap(int arr[], int num)
{
for (int i=int(num/2-1); i>=0; --i) //最后一个非叶子节点int(num/2-1),如果从1编号,则为int(num/2)
{
HeapAdjust(arr, i, num-1);
}
}
int main(int argc, char * argv[])
{
printf("Hello World\n");
int array[] = {12, 33, 2, 34, 29, 101, 7, 23, 48, 100};
int len = sizeof(array)/sizeof(array[0]);
BuildHeap(array, len);
for (int i=len-1; i>0; --i) //条件i>0,因为循环语句中有i-1
{
Swap(array, 0, i);
HeapAdjust(array, 0, i-1);
}
for (int i=0; i<len; ++i)
{
printf("%d ", array[i]);
}
printf("\n");
}
堆排序
最后编辑于 :
©著作权归作者所有,转载或内容合作请联系作者
- 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
- 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
- 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
推荐阅读更多精彩内容
- https://blog.csdn.net/qq_25800311/article/details/8976254...
- 基础堆排序和 Heapify 这一节我们介绍两个使用堆或者说基于堆的思想进行排序的算法。 思路1:一个一个地往最大...
- 堆排序就是把最大堆堆顶的最大数取出,将剩余的堆继续调整为最大堆,再次将堆顶的最大数取出(最大堆调整的递归运算),这...
- 堆基本概念 堆排序是一个很重要的排序算法,它是高效率的排序算法,复杂度是O(nlogn),堆排序不仅是面试进场考的...