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

堆排序

2013-10-04 03:06 2391 查看

堆排序是基于完全二叉树的排序。把一个完全二叉树调整为堆,以及每次堆顶元素交换后进行调整的时间复杂度均为O(lgn),所以堆排序的时间复杂度为O(nlgn)。堆排序的空间复杂度为O(1).堆排序是一种不稳定的排序。

堆排序的步骤为:

  1.将待排序的数组构建为一个最大堆
  2.在最大堆的基础上排序
  (1)把堆顶a[0]元素(最大的元素)和当前最大堆的最后一个元素交换
  (2)最大堆元素减一
  (3)调整跟节点使它满足最大堆 

java代码实现:

import java.util.Arrays;

/**
* 堆排序
* 1.将待排序的数组构建为一个最大堆
* 2.在最大堆的基础上排序
* 	(1)把堆顶a[0]元素(最大的元素)和当前最大堆的最后一个元素交换
*  (2)最大堆元素减一
*  (3)调整跟节点使它满足最大堆
*/
public class HeapSort {

/**
*@Description
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
int arr[] = {10,50,32,5,76,9,40,88};
heapSort(arr);
System.out.println(Arrays.toString(arr));
}

public static void heapSort(int arr[]){
initMaxHeap(arr);
int n = arr.length,temp;
for(int i=n-1;i>=0;i--){
//把堆顶a[0]元素(最大的元素)和当前最大堆的最后一个元素交换
temp = arr[0];
arr[0] = arr[i];
arr[i] = temp;
//逐渐缩小堆的大小
createMaxHeap(arr,0,i);
}
}

//初始化最大堆
public static void initMaxHeap(int arr[]){
int n = arr.length;
//从第一个非叶节点开始构造最大堆,注意完全二叉树的性质
for (int i = (n-1)/2; i >= 0; i--) {
createMaxHeap(arr,i,n);
}
}

/**
*@Description 创建最大堆
* @param arr 需要创建堆的数组
* @param i 开始下标
* @param n 堆的大小
*/
public static void createMaxHeap(int arr[],int i,int n){
int left = 2*i+1;
int	right = 2*i+2;
int largest = i;
if(left<n && arr[left]>arr[largest]){
largest = left;
}
if(right<n && arr[right]>arr[largest]){
largest = right;
}
if(largest!=i){
int temp = arr[i];
arr[i] = arr[largest];
arr[largest] = temp;
//递归地构建孩子节点,使其满足最大堆的特性
createMaxHeap(arr,largest,n);
}
}

}

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