堆排序

//面去哪儿网的时候,叫写个堆排序结果没写出来,直接就挂了,都是泪,第一次写博客记录,就从这个开始吧,(反正也没人看,就自己回忆着用委屈

//堆排序:堆分大堆和小堆,是完全二叉树,大堆即父节点大于左右子节点
	private int size;
	
	private void heapSort(int[] num)
	{
		this.size = num.length;
		
		/**
		 * 建堆,堆是由数组实现的,i从size/2,开始是因为要从最后一个节点的子节点开始下滤
		 */
		System.out.println(size);
		for(int i = size/2; i >= 0; i--)
		{
			percDown(num,i,size);
		}
		
		for(int i = size - 1; i > 0; i--)
		{
			//将根节点移动堆的最后一个节点中,就是deleteMin(deleteMax)的过程
			swap(num,0,i);
			percDown(num,0,i);
			
		}
		
		for(int i = size - 1; i >= 0; i--)
		{
			System.out.println(num[i]);
		}
	}
	// 交换第一个和最后一个元素 
	private void swap(int[] num, int a, int b)
	{
		int tmp = num[a];
		num[a] = num[b];
		num[b] = tmp;
		return;
	}
	
	private void percDown(int[] num, int i, int n)
	{
		int child;
		int tmp;
		int index = i;
		for(tmp = num[index] ; 2 * index < n; index = child)
		{
			child = 2 * index;
			// 找到子节点中较小的元素,保证不是最后一个元素,因为最后一个被交换后,是最小元素
			if(num[child] > num[child + 1] && child != n - 1)
			{
				child++;
			}
			
			/*  
			*第一个元素(一直都是用第一元素比较)依次和其子节点比较,比它小,则将  
			*child(子节点)的值赋给index(父节点)(将子节点向上层移动), 这一点很重要!!! 
			*直到最后一个
			**/
			if(num[child] < tmp)
			{
				num[index] = num[child];
			}
			else
			{
				break;
			}
		}
		
		num[index] = tmp;
	}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值