1.堆排序,使用了顺序二叉树的相关原理
思路:从第一个非子叶节点开始遍历,目标是实现大顶堆,然后把顶与顺序遍历的最后一个元素交换
然后依次交换至数组的第一个元素,实现排序
package math;
import java.util.Arrays;
public class heapsort {
public static void main(String[] args) {
int[] arr = new int[]{5,3,2,4,1};
new heapsort().heapsort(arr);
System.out.println(Arrays.toString(arr));
}
//堆排序首先基于生成大顶堆,取出被放置到顶的元素,与最后一个元素交换
//整个过程实现了把index处的数顶数大于左右
public void maxheap(int[] arr ,int size , int index ){
int lchildindex = 2*index+1 ;
int rchildindex = 2*index+2 ;
int max = index ;
if(lchildindex<size&& arr[lchildindex]>arr[max]){
max=lchildindex;
}
if(rchildindex<size && arr[rchildindex]>arr[max]){
max= rchildindex;
}
if(max!=index){
int temp = arr[index];
arr[index]=arr[max];
arr[max]=temp ;
maxheap(arr , size ,max) ; //交换了才会影响下面的树
}
}
public void heapsort(int[] arr ){
int sta = (arr.length-1)/2 ;
for(int i = sta ; i>=0 ; i--){
maxheap(arr,arr.length ,i);
}
for(int i = arr.length-1 ; i>0; i--){
int temp = arr[0];
arr[0]=arr[i];
arr[i]=temp ;
maxheap(arr,i,0);
}
}
}