/**
* 堆排序:稳定排序
* 核心思想:
* 1.构造二叉树,根最大;
* 2.拿出来后,放到数组最末位置。
* 3.继续构造大堆(数量到倒数第二个);
* 4.依次循环,直到所有的排好序
*
* 优点:比较时只用遍历一半
* @param array
*/
public void HeapSort(int [] array) {
if(array == null || array.length ==0) {
return;
}
//创建大堆
buildMaxHeap(array);
//从大到小是,从最边子树建到根,反之,可以自己考虑;
for(int i = array.length -1;i>=1;i--) {
//最大的元素排到了 下标 为 0 的位置
exchangeElements(array, 0, i);
maxHeap(array,i,0);
}
}
/**
*
* @param array
*/
private void buildMaxHeap(int[] array) {
int half = (array.length-1)/2;//假设长度为9,只需遍历01234
for(int i =half; i>=0 ; i--) {
//构造大堆
maxHeap(array,array.length,i);
}
}
/**
*
* @param array 数组
* @param length 数组长度
* @param i 开始的位置
*/
private void maxHeap(int[] array, int length, int i) {
int left = 2*i +1;
int right = 2*i +2;
//初始化:最大值的下标为根元素下标
int largest = i;
//根元素与左子树值比较,记录最大值的下标
if(left<length && array[left]>array[largest]) {
largest = left;
}
//根元素与右子树值比较,记录最大值的下标
if(right <length && array[right]>array[largest]) {
largest = right;
}
//最大值的下标与初始化值不同
if(i != largest) {
//交换元素位置,较大的元素为父节点
exchangeElements(array,i,largest);
//交换元素,重新构造大堆
maxHeap(array, length, largest);
}
}
/**
*
* @param array 数组
* @param i 交换的元素
* @param largest 交换的元素
*/
private void exchangeElements(int[] array, int i, int largest) {
int temp = array[i];
array[i] = array[largest];
array[largest] = temp ;
}
堆排序
最新推荐文章于 2023-09-21 13:21:58 发布