堆排序之大根堆:
1、先创建一个大根堆,位于节点数据大于或者等于左右孩子节点数据;
2、将位于根节点的数据和数组末尾索引的数据进行交换,然后维持大根堆的特性(如果需要交换数据);
3、将末尾索引减一,然后重复第2步骤;
#include<stdio.h>
#include<string.h>
#include<stdlib.h>void heap_sort(int *vector,int index,int element_count)
{
if (vector == NULL || index < 0)
{
return;
}int left_index = 2 * index + 1;
int right_index = 2 * index + 2;
while (left_index <= element_count)
{
int max = 0;
int max_index = 0;
if (right_index <= element_count)
{
if (vector[left_index] > vector[right_index] )
{
max = vector[left_index];
max_index = left_index;
}
else
{
max = vector[right_index];
max_index = right_index;
}
}
else
{
max = vector[left_index];
max_index = left_index;
}
if (vector[index] < max)
{
int temp = max;
vector[max_index] = vector[index];
vector[index] = max;
index = max_index;
left_index = 2 * index + 1;
right_index = 2 * index + 2;
}
else
{
break;
}
}
}void swap(int* vector,int left,int right)
{
int temp = vector[left];
vector[left] = vector[right];
vector[right] = temp;
}int main(int argc,char **argv)
{
int vector[] = {22,55,33,44,11,77,999,888,6541,789,934,10000,1000,100,234,555,321,423,667,5521,235,348,668,1257};
int element_count = sizeof(vector) / sizeof(int);
printf("element_count:%d\n",element_count);
printf("(element_count - 1) / 2 - 1:%d\n",(element_count - 1) / 2 - 1);
//heap binary
for (int index = (element_count - 1) / 2 - 1; index >= 0; index--)
{
heap_sort(vector,index,element_count - 1);
}
for (int index = element_count - 1; index >= 0; index--)
{
swap(vector,0,index);
heap_sort(vector,0,index - 1);
}for (int index = 0; index <= element_count - 1; index++)
{
printf(" %d \n",vector[index]);
}
exit(0);}