堆排序
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;
}
#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 socket 初步
- linux lsof详解
- 10 篇对初学者和专家都有用的 Linux 命令教程
- Linux 与 Windows 对UNICODE 的处理方式
- Ubuntu12.04下QQ完美走起啊!走起啊!有木有啊!
- 解決Linux下Android开发真机调试设备不被识别问题
- 运维入门
- 运维提升
- Linux 自检和 SystemTap
- Ubuntu Linux使用体验
- c语言实现hashmap(转载)
- Linux 信号signal处理机制
- linux下mysql添加用户
- 堆排序
- Scientific Linux 5.5 图形安装教程
- 基于 Linux 集群环境上 GPFS 的问题诊断
- 谁是桌面王者?Win PK Linux三大镇山之宝
- vivi下重新调整分区
- Linux VS Unix:Linux欲一统天下 Unix不死