排序算法之 堆排序

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Wastematerial/article/details/82228539

在堆中,我们熟悉的有小顶堆、大顶堆。其是怎么定义呢,正如一颗二叉树的数据结构,大顶堆的定义是每一个根(节点)都会比它们的两个节点的值要大,二小顶堆,其恰恰是跟大顶堆相反。

我们已大顶堆为例:

 堆排序的基本思想是:将待排序序列构造成一个大顶堆,此时,整个序列的最大值就是堆顶的根节点。将其与末尾元素进行交换,此时末尾就为最大值。然后将剩余n-1个元素重新构造成一个堆,这样会得到n个元素的次小值。如此反复执行,便能得到一个有序序列了。

首先是给无序序列构建一个初始的大顶堆:我们首先拿到的是这样的一个数组arr,

(第一个叶子节点,我们可以从二叉树的特性可知)

(此时在跟根节点调换之后,我们的子节点1 3 4 ,已经乱序了,这也是二叉树的调整思路,每次对子节点调换位置之后,都需要重新调整子树,这是二叉树一个比较重要的逻辑)

下面是一个初始堆的代码

package aobi.com.task;


import java.util.Arrays;

/**
 * Created by bianca on 2018/8/30.
 * 堆排序demo
 */
public class HeapSort {
    public static void main(String []args){
        int []arr = {7,5,9,4,6,2,3,1};
        sort(arr);
        System.out.println(Arrays.toString(arr));
    }
    public static void sort(int[] arr){
    	int n = arr.length;
    	for(int i = n/2-1;i>=0;i--){
    		adjustHeap(arr,i,arr.length);
    	}
    	
    }
    
  public static void adjustHeap(int []arr,int index,int length){
	  int temp = arr[index];
	  for(int j = index*2+1;j<length;j++){
		  if(j+1<length && arr[j]<arr[j+1]){
			  j++;
		  }
		  if(arr[j]>temp){
			  arr[index] = arr[j];
			  index = j;
		  }else{
			  break;
		  }
	  }
	   arr[index]=temp;
  }
}

这个步骤就不展示了,就是不断的调用上面的初始堆的方法。

参考链接https://www.cnblogs.com/chengxiao/p/6129630.html

猜你喜欢

转载自blog.csdn.net/Wastematerial/article/details/82228539