1)先把数据堆化(把数据插入到最后,然后向上循环)
2)再在堆的基础上从上向下循环排序
#include <stdio.h>
void sort(int data[], int size)
{
if (NULL == data)
{
return;
}
// 堆化
int i = 0;
for (i = 1; i < size; ++i)
{
int index = i;
while (index > 0)
{
int pindex = (index - 1) / 2;
if (data[pindex] < data[index])
break;
else
{
int tmp = data[pindex];
data[pindex] = data[index];
data[index] = tmp;
index = pindex; // 向上,如果新加入的节点小于父节点,就交换
}
}
}
// 排序
for (i = 0; i < size - 1; ++i)
{
int tail = size - 1 - i;
int head = 0;
// 将第一个数和最后一个交换
int tmp = data[tail];
data[tail] = data[head];
data[head] = tmp;
// 交换之后,就等于最小值拿到了最后,这时堆里的个每次都要减一
int heapsize = tail;
while (1) // 排序的话,要向下循环
{
int left = head * 2 + 1;
int right = head * 2 + 2;
int com = 0;
// 找到字节点中最小数值的那个节点,用来和父节点来交换(如果小于的话)
if (left >= tail)
break;
else if (right >= tail)
com = left;
else
{
if (data[left] < data[right])
com = left;
else
com = right;
}
if (data[com] < data[head])
{
tmp = data[com];
data[com] = data[head];
data[head] = tmp;
head = com;
}
else
break;
}
}
}
int main()
{
int data[] = {2, 74, 12, -3, 54, 43, 20, 98, 23, 129, 45};
int size = sizeof(data) / sizeof(*data);
sort(data, size);
int i = 0;
for (i = 0; i < size; ++i)
{
printf("%d, ", data[i]);
}
printf("\n");
return 0;
}