八大排序之堆排序

public class HeapSort {
	    private int [] data;
	    public HeapSort(int[] data) {
	        this.data = data;
	    }

	    public void sort(){                                    //堆排序包含AB两步
	        //A构建大顶堆
	        for(int i=data.length/2 - 1; i >= 0; i--){        //选出每个父节点,交给 adjustHeap方法进行调整将父节点调为大值
	            adjustHeap(i,data.length);
	        }
	        //B循环砍头并调整
	        for(int j=data.length-1;j>0;j--) {              //j--表示已经被砍出去的元素不再参与调整堆
				swap(0,j);
	        	adjustHeap(0,j);
	        }
	    }
	    public void swap(int a,int b) {
	    	int t=data[a];
	    	data[a]=data[b];
	    	data[b]=t;
	    }
	    private void adjustHeap(int i,int length){             //i为开头位置,父节点的序号
	        int temp = data[i];                                //temp为父节点      
	        for(int k=i*2+1;k<length;k=k*2+1){                 //k为左孩子序号,对左孩子依次进行循环,将父节点调整为最大值(该循环最终目的将最大值放在父节点)
	            if(k+1<length&&data[k]<data[k+1]){             //1.该if是选出左右孩子的最大值。右孩子序号<总长度,左<右,就需要改掉k的指向;左>右,不需要改掉k的指向
	                k++;                                      
	            }
	            if(data[k]>temp){                              //2.该if是调整父节点为最大值。左右节点最大值>父节点,调整父节点为最大值(注意:这是if,不是else if)
	                data[i]=data[k];
	                i=k;
	            }else{                                        //不需要调整了
	                break;
	            }
	        }
	        data[i]=temp;                                     //此时的父节点已为最大值,结束
	    }

	    public String toString() {
	        return Arrays.toString(data);
	    }

	    public static void main(String[] args) {
	        int arr [] =new int[]{13,23,34,12,8,354,6,123,9,245,23,7,812,19};
	        HeapSort heapSort = new HeapSort(arr);
	        heapSort.sort();
	        System.out.println(heapSort);
	    }

}
public class HeapSort {
   public static void main(String[] args) {
	int[] arr=new int[] {6,59,67,16,17,19,25,66};
	heapSort(arr);
	System.out.println(Arrays.toString(arr));
   }

	private static void heapSort(int[] arr) {
		for(int i=(arr.length-1)/2;i>=0;i--) {
			adjust(arr,i,arr.length);
		}
		for(int i=arr.length-1;i>0;i--) {
			int temp=arr[i];
			arr[i]=arr[0];
			arr[0]=temp;
			adjust(arr,0,i);
		}
	}
	private static void adjust(int[] arr,int parent,int length) {
		int temp=arr[parent];
		int lChild=2*parent+1;
		while(lChild<length) {
			int rChild=lChild+1;
			if(rChild<length&&arr[lChild]<arr[rChild]) {
				lChild++;
			}
			if(temp>=arr[lChild]) {
				break;
			}
			arr[parent]=arr[lChild];
			parent=lChild;
			lChild=2*lChild+1;
		}
		arr[parent]=temp;
	}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值