堆排序

递归

    public static void heapSort(int[] data) {  
        int size = data.length;
        for (int i = 0; i < size; i++) {  
            createMaxdHeap(data, size - 1 - i);  
            swap(data, 0, size - 1 - i);  
        }  
    }  
  
    public static void createMaxdHeap(int[] data, int last) { 
        for(int i = (last-1)/2; i >= 0; i--){//找root节点
            int tmp = i;
            while(tmp * 2 + 1 <= last){
                int big = tmp * 2 + 1;
                if(big < last && data[big] < data[big+1]){//比较左孩子和右孩子,取较大的index
                    big++;
                }
                if(data[tmp] < data[big]){//把大的上升到root
                    swap(data,tmp,big);
                    tmp = big;
                }else{
                    break;
                }
            }
        }
    }  
    public static void swap(int[] data, int i,int j){
        int tmp = data[i];
        data[i] = data[j];
        data[j] = tmp;
    } 

非递归

public class Solution {
    /**
     * @param A an integer array
     * @return void
     */
    public void sortIntegers2(int[] A) {
        // Write your code here
        // 堆
        heapSort(A);
    }
    
    static void heapSort( int[]a ){
        for(int n=a.length;n>0;n--){             
        //n,i均表示的是位置,不是数组下标;从整个堆开始,
            for(int i=n/2;i>0;i--){ 
            //比较父节点与子节点的值,将大的往上调
                if((2* i< n)&&( a[ i-1]< a[2* i])){ //满二叉树
                    swap(a,i-1,2*i); //  不能使用swap(a[i-1],a[2*i]),因为数组传递不过去,不能对数组元素值进行处理
                }
                if( a[ i-1]< a[2* i-1]){
                    swap(a,i-1,2*i-1);
                }
            }
            swap(a ,0,n -1);  //每次找到最大值存储在最末的位置
        }
    }
    public static void swap(int[] data, int i,int j){
        int tmp = data[i];
        data[i] = data[j];
        data[j] = tmp;
    } 
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容