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

数据结构排序问题---堆排序及各种排序时间空间复杂度

2014-10-24 16:11 435 查看
堆排序基本思路:根据完全二叉树,建立最大最小堆来排序

时间复杂度:O(nlongn)

/**
*
*/
package com;

/**
* @author wenb
* @time 下午03:52:55
* @date 2014-10-24
*/
public class HeapSort {

public static void main(String args[]){

int[] a = {1,3,2,21,5,12,98,54};
headSort(a);
for(int i=0;i<a.length;i++){

System.out.print(a[i]+" ");
}
}

public static int[] headSort(int[] sortArray){

for(int i=0;i<sortArray.length-1;i++){

buildMaxHeap(sortArray,sortArray.length-1-i);
swap(sortArray,0,sortArray.length-1-i);

}

return sortArray;
}

//交换两个数据的方法
public static void swap(int[] data,int i,int j){

int temp = data[i];
data[i] = data[j];
data[j] = temp;

}

//建立最大堆
public static void buildMaxHeap(int[] data,int lastIndex){

//从lastIndex节点的父节点开始舰堆
for(int i=(lastIndex-1)/2;i>=0;i--){
//保存正在判断的节点
int k = i;
//这里为每个节点建立大顶堆,只要这个根节点还有子节点
while((2*k+1) <= lastIndex){

//假设左节点的值时最大的
int biggerIndex = 2*k+1;
//说明还有右节点是存在的
if(biggerIndex < lastIndex){
//选出子节点中最大的值
if(data[biggerIndex] < data[biggerIndex+1]){
biggerIndex++;
}
}
//将跟节点与子节点进行比较
if(data[k] < data[biggerIndex]){
swap(data,k,biggerIndex);
k = biggerIndex;
}else{

break;

}
}
}
}
}


各种排序复杂度:



具体分析:http://blog.sina.com.cn/s/blog_771849d301010ta0.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: