您的位置:首页 > 理论基础 > 数据结构算法

一步步学习数据结构和算法之堆排序效率分析及java实现

2014-04-04 15:28 615 查看
堆排序效率分析及java实现:
public class HeapSort {
/**
* 堆排序原理:首先构建一个最大堆,然后将堆顶元素和末尾元素进行交换,交换之后自上而下进行一次排序,
* 堆排序时间复杂度为O(nlog2n),只是用了一个临时变量,所以空间占用率为O(1)
* 最好情况:时间复杂度:O(nlogn)
* 最坏情况:时间复杂度:O(nlogn)
* 空间占用情况:
* @param array
* @return
*/
public int[] heapSort(int[] array)
{
int len = array.length;//获取元素个数
for(int i=len/2;i>=0;i--) //构建最大堆
{
adjustHeap(array,i,len);
}

for(int i=len-1;i>=0;i--)
{
swap(array,0,i);//将堆顶元素与array[i]交换位置
adjustHeap(array,0,i);//从堆顶自上而下进行调整
}

return array;
}
/**
* 对最大堆进行自上而下的调整
* @param array
* @param k 指定的位置
* @param len 待调整元素数量
*/
public void adjustHeap(int[] array,int k,int len)
{
int temp = array[k];
int i=k,j=2*i+1;
while(j<len)
{
if((j+1)<len&&array[j+1]>array[j])//如果右子女存在并且大于左子女,指针++
{
j++;
}
if(temp>array[j])//如果当前定点大于子女,无需调整
{
break;
}
array[i] = array[j];
i = j; //移向下一个节点
j = 2*j+1;
}
array[i] = temp;
}
/**
* 进行元素调整
*/
public void swap(int[] array,int i,int k)
{
int temp = array[i];
array[i] = array[k];
array[k] = temp;
}
/***
* 打印排序结果
*/
public void print(int[] array )
{
for(int i=0;i<array.length;i++)
{
System.out.print(array[i]+",");
}
}

public static void main(String[] args) {
HeapSort hs = new HeapSort();
int[] array = {1,5,9,3,4,18,7,6};
hs.print(hs.heapSort(array));
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息