堆排序 java实现

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;
			}
		}
		
	}
	
}

阅读更多
上一篇shell排序 java实现
下一篇java 归并排序实现
想对作者说点什么? 我来说一句

Java实现堆排序

2017年12月05日 2KB 下载

没有更多推荐了,返回首页

关闭
关闭