那一夜....
风在刮,雨在下

堆排序基本思路:根据完全二叉树,建立最大最小堆来排序

时间复杂度: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

posted on 2014-10-24 16:11  暮雨倾晨  阅读(552)  评论(0编辑  收藏  举报