排序算法——堆排序

1. 堆排序简介

堆排序包括两个过程:

1)建堆:将原有序列建成最小堆(或最大堆)

具体过程(为了加强理解):

从第length/2个树节点开始遍历,每次根据大小调整以该节点为根的子树的顺序,使其成为最小堆;

因此需要遍历多遍,每次遍历中都调整从当前节点到最后一个节点的树,使成为最小堆。

2)排序:每次将堆顶元素调整到最后位置;再调整堆结构,使其成为最小(大)堆;


2. java实现

重点是adjust方法,实现从begin节点到end节点的调整(调整使成为最小堆)。

    //实现堆排序;
    public static void heapSort(int[] nums) {
    	int length=nums.length;
    	int k=length/2-1;
    	for(int i=k;i>=0;i--) {
    		adjust(i,length,nums);
    	}
    	int count=length-1;
    	while(count>0) {
    		swap(count,nums);
    		adjust(0,count,nums);
    		count--;
    	}
    }

	private static void swap(int count, int[] nums) {
		int temp=nums[count];
		nums[count]=nums[0];
		nums[0]=temp;
	}

	private static void adjust(int begin, int end, int[] nums) {
		//从begin-end调整;
		//begin先与叶节点比较大小,选择一个较小者,后继续向下比较;
		int temp=nums[begin];
		for(int k=2*begin+1;k<end;k=2*k+1) {
			if(k+1<end&&nums[k]<nums[k+1])
				k++;
			if(nums[k]>temp) {
				nums[begin]=nums[k];
				begin=k;
			}else break;
		}
		nums[begin]=temp;
	}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值