您的位置:首页 > 编程语言 > Java开发

《七大排序算法》(五)之堆排序(Java实现)

2017-08-21 15:39 148 查看
堆排序,就是对简单选择排序进行的一种改进,这种改进的效果是非常明显的,等会会讲下改进的效果。堆排序算法是Floyd和Williams在1964年共同发明的,同时,他们也发明了“堆”这样的数据结构。

堆是具有下列性质的完全二叉树:每个节点的值都大于或者等于其左右孩子结点的值,称其为大顶堆。



完全二叉树有一个性质:如果i等于1,则i是二叉树的艮,无双亲;如果i>1,则其双亲是节点i/2(下取整)。那么package HeapSort;

import java.util.Arrays;

public class SimpleHeapSort {
/*
* 构建最大堆
*/
static void heapAdjust(int arr[],int s,int m){
int temp,j;
temp = arr[s];
for(j = 2*s;j<m;j*=2){
if(j<=m && arr[j]>arr[j+1])
++j;
if(arr[j] >=temp)
break;
arr[s] = arr[j];
s = j;
}
arr[s] = temp;
}

static void heapSort(int arr[]){
int i,temp;
for(i = arr.length/2-1;i>=0;i--)
heapAdjust(arr,i,arr.length-1);
for(i = arr.length-1;i>=1;i--){//将堆顶记录和当前未经排序子序列的最后一个记录交换
temp = arr[0];
arr[0] = arr[i];
arr[i] = temp;
heapAdjust(arr,0,i-1);
}
for(int a : arr)
System.out.print(a+" ");
}
public static void main(String[] args) {
int arr[] = {50,10,90,30,70,40,80,60,20};
heapSort(arr);
}

}

对于有n个结点的二叉树而言,它的i值自然就是小于等于n/2(下取整),也就是下标i与2i跟2i+1是双亲子女关系。
基本算法思想:将待排序的序列构成一个大碓顶。此时,整个序列的最大值就是堆顶的根节点。将它移走(其实就是将其与堆数组的末尾元素交换,此时末尾元素最大值),然后将剩下的n-1个序列重新构成一个堆,这样就会得到n个元素中的次小值,这样如此反复执行,便能得到一个有序的序列。

图解算法:






代码:
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息