Java算法-堆排序

基本思想

1.将待排序的序列构造成大顶堆,根据大顶堆的性质,当前的堆顶是序列中最大的元素。

2.将堆顶元素与堆底元素进行交换,将剩下的元素构造成大顶堆。

3.重复2.

步骤

第一步:构建大顶堆

 1.初始化状态

2. 节点parent不存在孩子节点,p往前移动

 3.节点1,9,4也不存在孩子节点,p继续往前移动。节点5有孩子结点

4.节点5的值大于lchild的值, p继续往前移动。

5.节点3的值小于lchild的值,与lchild进行值交换。父节点指向lchild,父节点没有孩子节点,p前移。

 6.节点7的值大于lchild,lchild的值大于rchild,p前移。

 7.节点8的lchild的值小于rchild,lchild++指向rchild。rchild大于8,与rchild进行值交换。

 第二步:将堆顶元素与堆底元素进行交换,剩余的元素重新构造大顶堆(重复第一步)

1.堆顶堆底值交换

 2.剩余元素构建大顶堆

 3.堆顶堆底值交换

  4.剩余元素构建大顶堆

 5.堆顶堆底值交换

 6.剩余元素构建大顶堆

 7.堆顶堆底值交换

 8.剩余元素构建大顶堆

9 .堆顶堆底值交换

10.剩余元素构建大顶堆

 11 .堆顶堆底值交换 

 12.剩余元素构建大顶堆

 13.堆顶堆底值交换

 排序结果

实现代码 

package com.qcby;

import java.util.Arrays;

public class HeapSort {
	//堆排序
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		int[] arr = { 8,7,3,5,4,9,1,3 };
		for (int p = arr.length - 1; p >= 0; p--) {
			adjustHeap(arr, p, arr.length);
		}
		System.out.println(Arrays.toString(arr));
		for (int p = arr.length - 1; p > 0; p--) {
			int temp = arr[0];
			arr[0] = arr[p];
			arr[p] = temp;
			adjustHeap(arr, 0, p);
			System.out.println(Arrays.toString(arr));
		}
		//System.out.println(Arrays.toString(arr));

	}

	public static void adjustHeap(int[] arr, int parent, int length) {
		int temp = arr[parent];
		int lchild = parent * 2 + 1;
		while (lchild < length) {
			int rchild = lchild + 1;
			if (rchild < length && arr[lchild] < arr[rchild]) {
				lchild++;
			}
			if (temp > arr[lchild]) {
				break;
			}
			arr[parent] = arr[lchild];

			parent = lchild;
			lchild = parent * 2 + 1;
		}
		arr[parent] = temp;
	}
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值