八大排序之堆排序

堆排序的特点:堆排序是利用了堆的数据结构设计的算法;首先堆属于完全二叉树,完全二叉树是一种树的结构,完全二叉树必须满足从上到下,从左到右排序,也就是说有右子树的前提是必须要有左子树;一个数组的完全二叉树为

堆排序的基本思想:
1.将待排序的序列构造成一个大顶堆,根据大顶堆的性质,当前堆的根节点是序列中的最大值;
2.将堆顶元素与末尾元素进行交换,然后接着构建大顶堆;
3.重复步骤2,每一次都会得到一个当前序列的最大值,并且放到最后,这样我们就可以得到一个有序的序列。

在这里插入图片描述

算法描述:
1.定义一个指针 parent 指向非叶子节点,根据parent指针找到当前节点的左右孩子,定义指针 lChild 指向左孩子,定义指针 rChild 指向右孩子,然后比较左右孩子节点的值,让 lChild 指针指向大的那个节点,然后比较 lChild 和 parent 的值,若是 lChild 的值大于 parent ,那么交换两个值。以此执行以此后,会将最大值放到根节点;
2.交换堆顶元素和末尾元素,此时,将换下来的堆顶的元素不看做下一次排序的 元素,依然执行1


```java
package com.test;
import java.util.Arrays;
public class duipaixu{
		public static void main(String[] args) {
			int[]arr = new int[] {4,8,7,6,9,41,1,2,0};
			for(int p = arr.length-1;p>=0;p--) {
				adjustHeap(arr,p,arr.length);
			}
			heapSort(arr);
			System.out.println(Arrays.toString(arr));
		}
		public static void heapSort(int[]arr) {
			for(int i = arr.length-1;i>0;i--){
					int temp = arr[i];
					arr[i] = arr[0];
					arr[0] = temp;
					adjustHeap(arr,0,i);			
		}
		}
		public static void adjustHeap(int[]arr,int parent,int length) {
			//定义一个临时的空间去记录父节点的值
			int temp = arr[parent];
			//左孩子
			int lchild = 2*parent+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];
				//向下筛选找到temp的位置
				parent = lchild;
				lchild = 2*lchild+1;	
				}
			arr[parent] = temp;
			}
	}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值