八大排序之堆排序

堆排序

思想:

  • 首先将需要排序的数组放入树中,将树进行大顶堆或者小顶堆排序,当然只是采用树的结构思想

    大顶堆(根节点比左右孩子都大) 小顶堆(根节点比左右孩子节点都小)
    注:通常大顶堆用于从小到大的排序 小顶堆用于从大到小排序

  • 然后将排好序的大顶堆的第一个节点和最后一个节点交换位置 把最后一个节点取出,即为最大数

  • 然后将剩下的树再进行大顶堆排序,重复上述步骤,直到最后一个节点完成,堆排序完成。

     public class HeapSort {
     
     	public static void main(String[] args) {
     		int[] array = new  int[]{3,1,8,34,93,1,35,34,7,9,6,5};
     		System.out.println(Arrays.toString(array));
     		heapSort(array);
     		System.out.println(Arrays.toString(array));
     	}
     	
     	public static void heapSort(int[] array){
     		//最后一个叶子节点的双亲节点
     		int index = (array.length - 1)/2;
     		for(int i = index; i >= 0; i--){
     			//排序成大顶堆
     			maxHeap(array, array.length, i);
     		}
     		//将最后一个元素拿出				
     		for (int i = array.length -1; i > 0; i--) {
     			 int temp = array[0];
     			 array[0] = array[i];
     			 array[i]= temp;
     			 //从上往下使树成为大顶堆结构
     			 maxHeap(array,i,0);
     		}	    		  
     	}
     	
     	/**
     	 * 将树转化为大顶堆
     	 * @param array  需要排序的数组
     	 * @param size   排序的大小,每次完成大顶堆之后减1
     	 * @param index  从最后一个叶子节点的双亲节点开始
     	 */
     	public static void maxHeap(int[] array,int size,int index){
     		//左孩子
     		int leftNode = (index*2)+1;
     		//右孩子
     		int rightNode = (index*2)+2;
     		int max = index;
     		//找出双亲节点和左右孩子节点中最大的
     		if(leftNode < size&&array[max]<array[leftNode]){
     			max = leftNode;
     		}
     		if(rightNode < size&&array[max]<array[rightNode]){
     			max = rightNode;
     		}
     		//当父节点不是最大的时候,交换位置使父节点变为最大
     		if(max != index){
     			int temp = array[index];
     			array[index] = array[max];
     			array[max] = temp;
     		//当交换位置后,可能会破坏原来已经排好序的大顶堆平衡
     			maxHeap(array, size, max);
     		}
     		
     	}
     }
    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值