堆排序 java实现

11人阅读 评论(0) 收藏 举报
package com.algorithm.charactor1;

import java.util.Arrays;
import java.util.Random;

/**
 *先构建一个最大堆,然后对最大堆上的 进行删除操作 ,然后放到 
 */
public class HeapSort {
	static int arrSize;
	static int newArraySize ;
	public static void main(String[] args) {
		long currentTimeMillis = System.currentTimeMillis();
		Integer [] arr  = new Integer[100000];
		for (int i = 0; i < 100000; i++) {
			arr[i] = new Random().nextInt(10000);
		}
		
		//构建最大堆
		Integer[] sortArray = buildHeap( arr );
		Integer[] newArray = new Integer[sortArray.length];
		newArraySize = newArray.length;
		
		//最大堆构建完后,依次删除 堆顶元素,将堆顶元素 放到新数组完成排序
		for (int i = 0; i < sortArray.length; i++) {
			Integer max = deleteMax(sortArray);
			newArray[newArraySize] = max;
		}
		System.out.println(Arrays.toString(newArray));
		System.out.println(System.currentTimeMillis()-currentTimeMillis);
	}

	
	//删除堆顶元素,默认把当前数组最后一个元素放到堆顶下滤
	private static Integer deleteMax(Integer[] sortArray) {
		Integer max = sortArray[0];
		sortArray[0] = sortArray[--newArraySize];
//		sortArray[newArraySize] =null;
		filterDown(0,sortArray);
		
		return max;
	}


	private static Integer[]  buildHeap(Integer[] arr) {
		for (int i = arr.length/2 -1; i >= 0; i--) {
			filterDown(i,arr);//依次从子节点 的 父节点开始下滤。
		}
		return arr;
	}

	private static void filterDown(Integer parent,Integer[] arr) {
		//获取到最大的值,
		int child = parent*2 +1;
		
		
		for (; child < arr.length; child=parent*2+1) {
			if ( child != arr.length-1 && arr[child] < arr[child+1]) {
				child++;
			}
			if (arr[child] > arr[parent]) {//子节点最大值大于父节点,两个值交换
				Integer temp = arr[child] ;
				arr[child] = arr[parent];
				arr[parent] =temp;
				parent =child;
			}else {
				break;
			}
		}
		
	}
	
}

查看评论

【排序算法】堆排序原理及Java实现

1、基本思想堆是一种特殊的树形数据结构,其每个节点都有一个值,通常提到的堆都是指一颗完全二叉树,根结点的值小于(或大于)两个子节点的值,同时,根节点的两个子树也分别是一个堆。 堆排序就是利用堆(...
  • jianyuerensheng
  • jianyuerensheng
  • 2016-04-27 18:34:23
  • 12846

堆排序(Heapsort)之Java实现

堆排序算法介绍 堆是一种重要的数据结构,为一棵完全二叉树, 底层如果用数组存储数据的话,假设某个元素为序号为i(Java数组从0开始,i为0到n-1), 如果它有左子树,那么左子树的位置是2i+1,如...
  • kimylrong
  • kimylrong
  • 2013-12-05 22:25:31
  • 54681

算法(第四版)学习笔记之java实现堆排序

继上一篇实现基于堆的优先队列后,这次将利用上一次完成的基于堆的能够重复删除最大元素操作的优先队列来实现一种经典而优雅的排序算法,称之为堆排序。 堆排序可分为两个阶段: 1.构建堆:在堆的构建过程中...
  • l243225530
  • l243225530
  • 2015-07-26 16:02:37
  • 1228

HeapSort堆排序Java实现图文代码详解

堆排序(Heapsort)堆积树设计的一种排序算法,可以利用数组的特点快速定位指定索引的元素。 排序图如下:(gif来自维基百科) 堆排序的过程就是首先构建大根堆,然后对顶元素(及最大元素)与最...
  • wg1033755123
  • wg1033755123
  • 2015-04-12 14:04:13
  • 1042

基本算法_堆排序_Java实现

堆排序就是将序列调整为指定的堆,然后调整首尾元素的位置,取出末尾元素,反复进行,直到将所有元素取出,形成一个有序的序列。...
  • ljmingcom304
  • ljmingcom304
  • 2015-12-22 14:14:42
  • 2375

堆排序 java实现

  • 2011年10月24日 15:11
  • 1KB
  • 下载

java编程题:用Java实现一个堆排序算法

import java.util.Arrays; /** * java编程题:用Java实现一个堆排序算法 */ public class Test21 { public stati...
  • min996358312
  • min996358312
  • 2017-03-29 19:11:07
  • 276

java实现算法之堆排序

本文参考文章:http://blog.csdn.net/morewindows/article/details/6709644 堆排序与快速排序,归并排序一样都是时间复杂度为O(N*logN)的几种常...
  • Rebirth_Love
  • Rebirth_Love
  • 2016-05-08 19:18:41
  • 924

【java面试】算法篇之堆排序

一、堆的概念 堆是一棵顺序存储的完全二叉树。完全二叉树中所有非终端节点的值均不大于(或不小于)其左、右孩子节点的值。 其中每个节点的值小于等于其左、右孩子的值,这样的堆称为小根堆; 其中每个节点的值大...
  • qq_21492635
  • qq_21492635
  • 2017-06-12 14:23:38
  • 3172

Java实现堆排序

  • 2017年12月05日 17:29
  • 2KB
  • 下载
    个人资料
    持之以恒
    等级:
    访问量: 1699
    积分: 300
    排名: 25万+