您的位置:首页 > 其它

堆排序

2018-03-05 01:49 225 查看
一直对这种排序没有仔细了解,今天学习了一下

1.排序规则若是升序,则先构建大顶堆,反之构建小顶堆

2.该例使用升序排序

给定一个整形数组a[]={20,50,10,30,70,20,80}



首先构造大顶堆









注意这里,元素20和元素80交换后,20所在的节点还有子节点,所以还要再和它的子节点5 6的元素进行比较,因此代码中adjustHeap函数递归调用,以防止交换后原节点不满足规则

至此有序堆已经构造好了!如下图



然后对堆进行调整

1.堆顶和堆尾进行交换

2.堆长度减1

3.从堆顶开始自上往下调整

由于函数递归执行,所以只需执行一次即可







依次类推,最终



思路很简单,唯一难点如何在于代码中递归的实现调整

public class Sort {

public static void main(String[] args) {
int[] arr = new int[]{2,3,2,1,23232,12321,2122};
heapSort(arr);
System.out.println(Arrays.toString(arr));

}
static public void heapSort(int[] arr){
int length = arr.length;
//创建大顶堆
int beginIndex = length / 2 - 1;
for(int i = beginIndex; i >= 0; i --) {
adjustHeap(arr,i,length);
}
//调整
int n = length - 1;
for (int i = 0; i < length - 1; i++) {
swap(arr,0,n);
n--;
adjustHeap(arr,0,n + 1);
}

}

static public void adjustHeap(int[] arr,int i,int length){

int left = 2 * i + 1;
int right = 2 * i + 2;

if (left >= length) return; //是叶子节点
int maxindex;
if(left < length && right < length) {
if(arr[left] > arr[right])
maxindex = left;
else
maxindex = right;
}
else
maxindex = left;
if (arr[i] < arr[maxindex]) {
swap(arr, i, maxindex);
//递归操作,避免交换后出现错误
adjustHeap(arr,maxindex,length);
}

}

static public void swap(int[] arr, int index1, int index2) {

arr[index1] = arr[index1] ^ arr[index2];
arr[index2] = arr[index2] ^ arr[index1];
arr[index1] = arr[index1] ^ arr[index2];
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: