详解堆(heap)排序

一、认识堆

        堆是一种基本的数据结构。在这里我用数组来形容,在一个二叉堆的数组中,每一个元素都要保证大于等于另外两个特定位置的元素。同时相应的,这些元素又要大于等于另外两个相应位置的元素,整个数据结构以此类推。如果我们将整个数据结构画成树状结构,就能够清晰地看出整个结构的样子。

 图一我们称之为大顶堆:大顶堆的特性就是父节点大于或者等于它的左右孩子

 图二我们称之为小顶堆:小顶堆的特性和大顶堆相反,就是父节点小于或同于它的左右孩子

下标为i的节点的父节点下标:(i - 1)/ 2[  整数除法 ]

下标为i的节点的左孩子下标:i * 2 + 1

下表为i的节点的右孩子下标:i * 2 + 2

二、维护堆得性质

                        就是将无序的堆变成大顶堆或者小顶堆

        未排序前

         排序后

     

 三、代码实现

#include <stdio.h>
#include <string.h>
#include <strings.h>

int arr[10]={5,6,9,8,4,0,1,2,7,3};
int n = sizeof(arr);

void heapify(int i)//维护堆的性质
{
		int largest = i;
		int lson = i* 2 + 1;
		int rson = i*2 + 2;
		if ( lson < n && arr[ largest] < arr[ lson])
				largest = lson;
		if (rson < n && arr[ largest] <arr[rson])
				largest = rson;
		if (largest != i)
		{
			int temp;
			temp = arr[largest];
			arr[largest] = arr[i];
			arr[i] = temp;
			heapify(largest);
		}
}

//堆排序入口
void heap_sort(void)
{
	int i;//建堆
	for(i =n/ 2 -1; i >=0; i--)
		heapify(i);
//排序
	for (i = n - 1; i > 0; i--)
	{
		int temp;
		temp = arr[i];
		arr[i] = arr[0];
		arr[0] = temp;
	//	swap(&arr[i],&arr[0]);
		heapify(0);
	}
}

int main(int argc,char *argv[])
{
	int i=0;//数组的下标
	heapify(i);
	heap_sort();
	int j;
	for(j=0;j<10;j++)
	{
			printf("%d   ",j);
	}
	printf("\n");
	return 0;
}

 四、运行结果

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值