目录
堆排序:
时间复杂度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:两个数一样
如果想要从小到大排序的话
在排序中加入比较器