算法的深入浅出--7.二叉树定义和简单计算及大根堆进行堆排序及算法的稳定性及比较器的使用

目录

一、满二叉树定义

二、完全二叉树定义

三、 非完全二叉树定义

四、完全二叉树的一些简单计算

五、大根堆

六、小根堆

七、大根堆进行堆排序

八、算法的稳定性

九、比较器的使用


堆排序:

时间复杂度O(N*logN),额外空间复杂度O(1)

题外话:

一、满二叉树定义

就是除叶子结点外,所有的结点都有左孩子和右孩子:

二、完全二叉树定义

满二叉树一定是完全二叉树

也就是在满二叉树的下面,如果要下面一排有叶子结点,那必须是完整的从左至右的结点。

三、 非完全二叉树定义

四、完全二叉树的一些简单计算

它的数组结构(所有的二叉树都只是一个逻辑模型,真正实现的实现都是采用其他数据结构实现的):

五、大根堆

 在完全二叉树中所有的子树最大值都是它的root结点上的值

六、小根堆

在完全二叉树中所有的子树最小值都是它的root结点上的值

求父节点的计算:n=(c-1)/2

七、大根堆进行堆排序

package cn.mxl;

public class Heapsort {

	public static void heapSort(int[] arr) {
		if(arr==null || arr.length < 2) {
			return ;
		}
		for(int i=0;i<arr.length;i++) {
			heapInsert(arr,i);
		}
		int heapSize=arr.length;
		swap(arr,0,--heapSize);
		while(heapSize > 0) {
			heapify(arr,0,heapSize);
			swap(arr,0,--heapSize);
		}
	}
	
	public static void heapInsert(int[] arr,int index) {
		while(arr[index]>arr[(index-1)/2]) {
			swap(arr,index,(index-1)/2);
			index=(index-1)/2;
		}
	}
	
	public static void heapify(int[] arr,int index,int heapSize) {
		int left=index*2+1;
		while(left<heapSize) {
			int largest=left+1<heapSize && arr[left+1]>arr[left]
					?left+1
					:left;
			largest=arr[largest]>arr[index]?largest:index;
			if(largest==index) {
				break;
			}
			swap(arr,largest,index);
			index=largest;
			left=index*2+1;
		}
	}
	
	private static void swap(int[] arr, int i, int j) {
		// TODO Auto-generated method stub
		int temp =arr[i];
		arr[i]=arr[j];
		arr[j]=temp;
	}
	
	
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		int[] arr= {3,1,5,7,3,5};
		heapSort(arr);
		for (int i : arr) {
			System.out.println(i);
		}
	}

}

时间复杂度O(N*logN),额外复杂度O(1)

八、算法的稳定性

存在稳定性的算法:归并排序、

无法做到稳定性的算法:快速排序(简单快速排序,深入的研究是可以做到的),堆排

九、比较器的使用

在比较器中

如果返回的是负数,那就是将第一个参数放在前面

如果返回的是正数:那就是将第二个参数放在前面

如果返回的是0:两个数一样

如果想要从小到大排序的话

在排序中加入比较器

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值