大根堆,根最大。左孩子 2n+1,右孩子2n+2(堆排序实现是数组)
堆排序
package Sort;
/**
* @author: 贾兴伟
* @date: Created in 21:33 2020/12/8
*/
public class Heapsort {
//用二叉树的概念
//heapsort这个函数的作用就是找到一部分树的最大并把它放到end处。
public static void heapsort(int[] array,int start,int end){
//树有下标,这里创建一个起始下标,和终止下标。
//将start下标的元素存放在变量tmp里。
int tmp =array[start];
//这里的循环是找儿子的过程
for(int i =2*start+1;i<=end;i=2*i+1){
if(i+1<=end&&array[i]<array[i+1]){
//左儿子比右儿子小i就++到右儿子位置
i++;
}
//tmo保存的都是要比较的根的值
if(array[i]>tmp) {
//儿子比根大就把儿子放到根处,即start处。
array[start] = array[i];
//继续往下找,start更新到i;
start = i;
}else {
break;
}
}
//最后把存在tmp的根的值放到更新到的i的位置。
array[start]=tmp;
}
//从右下方最小部分树开始排序,叶子每次都对比到end处。
public static void beginsort(int[] array){
for (int i=(array.length-1-1)/2;i>=0;i--){
//为什么end是array.length-1?
heapsort(array,i,array.length-1);
}
//heapsort函数将最大的值放到了最前面所以写个循环让他们从小到大
for (int i=0;i<array.length;i++){
int tmp =array[0];
array[0]=array[array.length-1-i];
array[array.length-1-i]=tmp;
heapsort(array,0,array.length-1-i-1);
}
}
public static void show(int array[]){
for(int i=0;i<array.length;i++){
System.out.print(array[i]);
}
System.out.println(" ");
}
public static void main(String[] args) {
int[] arr1 =new int[]{
8,5,4,9,7,2,1,5,6,4};
int[] arr2 =new int[]{
2,8,4,6,8,7,2,6};
int[] arr3 =new int[]{
5,7,9,4,5,7,5,6,3,1,7,2,8,4};
beginsort(arr1);
beginsort(arr2);
beginsort(arr3);
show(arr1);
show(arr2);
show(arr3);
}
}