22.1.8 堆排序、桶排序
1. 堆排序:时间复杂度:O(nlogn), 空间复杂度:O(1)
(1)完全二叉树:
-
第i个节点的左孩子:2*i+1;
-
第i个节点的右孩子:2*i+2;
-
(2)大根堆:以节点i为根节点的子树中,节点i上的值是这棵子树中最大的。
(3)小根堆:以节点i为根节点的子树中,节点i上的值是这棵子树中最小的。
(4)code:
public static void main(String[] args)
{
int[] arr = {2,5,3,6,2,1,9,7,8};
heapSoft(arr);
for(int cur:arr)
System.out.print(cur+" ");
}
public static void swap(int[] arr, int i, int j)
{
int tmp = arr[i];
arr[i] = arr[j];
arr[j] = tmp;
}
public static void heapSoft(int[] arr)
{
if(arr == null || arr.length<2)
return;
int heapsize = arr.length;
//两个方法构建大根堆
for(int i=0;i<arr.length;i++)//O(N)
heapinsert(arr,i);//该操作时间复杂度为O(logn)
//for(int i = arr.length-1;i>=0;i--)
//heapify(arr,i,arr.length);//该操作时间复杂度为O(N)
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);