您的位置:首页 > 运维架构 > Linux

堆排序

2015-09-20 22:45 423 查看
思想:将数组转为二叉树,调整为最大堆,然后将第一个数与末尾数交换,在调整最大堆,重复步骤

#include <stdio.h>

//输出

void print(int array[], int size)
{
int i = 0;
for(i = 0; i < size; i++)
{
printf("%d ", array[i]);
}
printf("\n");
}

//两数交换

void swap(int *a, int *b)
{
int temp = *a;
*a = *b;
*b = temp;
}

//调整最大堆
void maxHeapify(int array[], int i, int size)
{
int left = i * 2 + 1; //采用索引值计算,数组第一个下标从0开始
int right = i * 2 + 2;
int max_index = 0;
if(right >= size || left >= size) //大于数组大小返回
{
return;
}

//比较出根、左节点、右节点最大的
if(array[left] > array[i])
{
max_index = left;
}
else
{
max_index = i;
}
if(array[right] > array[max_index])
{
max_index = right;
}

//如果最大的不为根节点,则进行交换,
//并对进行交换的子节点进行对调整
if(max_index != i)
{
swap(&array[i], &array[max_index]);
maxHeapify(array, max_index, size);
}
}

//建立最大堆

void build_max_heap(int array[], int size)
{
//计算第一个根节点的下标
int index = (size - 2) / 2;
int i = 0;

//从下往上进行根节点遍历
for(i = index; i > -1; i--)
{
maxHeapify(array, i, size);
}
}

void heap_sort(int array[], int size)
{
//建立最大堆
build_max_heap(array, size);
while(size != 1)
{
//交换第一个节点和最后一个节点
swap(&array[0], &array[size - 1]);

//堆大小减一,因为最后一个数为最大,为已排序的数
size--;

//调整堆
maxHeapify(array, 0, size);
}
}

int main()
{
int array[] = {23, 45, 2, 54, 34, 3, 67, 234, 3, 67, 57};
heap_sort(array, 11);
int i = 0;
print(array, 11);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  linux 堆排序