基本算法之堆排序

堆排序

1、堆排序
什么是堆?堆是一种完全二叉树,并且满足每个结点的值都不小于或者不大于其左右结点的值。再简单的说就是利用大顶推或者小顶堆进行排序。堆排序基本思路:将待排序的序列构造成一个大顶堆,这时整个序列最大值就是根节点,将根节点与堆得末尾结点进行交换后,剩下的结点重新构成一个大顶堆,此时,次大值就是根节点,重复进行上面步骤,就可以得到一个有序序列。
2、代码实现

public static void heapSort(){
		int[] sort = { 68, 24, 91, 88, 6, 7, 5, 33, 10 }; 
		
		int i;
		for(i = sort.length/2-1; i >= 0; i--){
			buildHeap(sort,i,sort.length);			//调整为大顶堆
		}
		
		for (i = sort.length-1; i > 0; i--) {
			swap(sort,0,i);							//交换
			buildHeap(sort,0,i);					//重新构建大顶堆
		}
		
		for (int j = 0; j < sort.length; j++) {
			System.out.println(sort[j]);
		}
	}
	
	public static void buildHeap(int[] sort,int i,int n){
		int temp ,child = 0;
		for(temp = sort[i];(2*i+1) < n;i = child){
			child = 2*i+1;		//左孩子索引
			if(child != n-1 && sort[child] < sort[child + 1])
				child++;
			if(temp < sort[child])
				sort[i] = sort[child];
			else
				break;
		}
		sort[i] = temp;
	}
	
	public static void swap(int[] list,int i,int j){
		int temp = list[i];
		list[i] = list[j];
		list[j] = temp;
	}


3、小结: 堆排序运行的时间主要消耗在构建堆上和重建堆得反复筛选。构建堆从完全二叉树的最底层最右边非叶子结点
开始,将他与其孩子结点进行比较和互换,构建堆得时间复杂度为 O(n) ,重建堆得时间复杂度为O(nlogn),所以平均时间
复杂度为O(nlogn)。堆排序性能远远高于简单排序、冒泡排序、直接插入排序时间复杂度的O(n²)。堆排序是一种不稳定
的排序。




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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值