2.6堆排序打卡

2.6堆排序
时间复杂度o(n*logn)

堆排序.png

思路:0~N-1 个数
1.将数组中的n个数建成大小为n的大根堆
2.堆顶元素为整个元素的最大值,将堆顶元素和堆的最后一个元素进行交换,将最大值脱离出整个堆结构放在数组的最后位置,作为数组的有序部分
3.把N-1最大值大小的值进行堆调整,再将最大值和组数的最后位置进行交换,作为数组的有序部分
......
4.依次进行堆调整,最后位置交换,得到一个有序数列

import java.util.*;
public class HeapSort {

public int[] heapSort(int[] A, int n) {
    BUILD_MAX_HEAP(A);
        SORT_HEAP(A);
        return A;
    }

    /**
     * 堆排序
     * @param A
     */
    private void SORT_HEAP(int[] A) {
        for (int i = A.length-1;i >=0;i--) {
            swap(A, 0, i); // 将堆尾和堆顶交换
            // 0~length(A)-1 的堆,重新建堆
            MAX_HEAPIFY(A, 0, i-1);
            //
        }
    }
  
    /**
     * 建堆
     * @param A
     */
    private void BUILD_MAX_HEAP(int[] A) {
        for (int i = A.length/2-1;i >= 0;i--) {
            MAX_HEAPIFY(A, i, A.length-1); 

        }
    }
  
    
    /**
     * 保持堆的性质
     * @param A
     * @param i
     * @param end
     */
    private void MAX_HEAPIFY(int[] A, int i, int end) {
        int l = LEFT(i);
        int r = RIGHT(i);
        int largest;
        if (l <= end && A[l] > A[i]) {
            largest = l;
        }else {
            largest = i;
        }
        if (r <= end && A[r] > A[largest]) {
            largest = r;
        }
        if (largest != i) {
            swap(A, i, largest);
            MAX_HEAPIFY(A, largest, end);
        }
    }
  
    private int LEFT(int i) {
        return 2*i+1;
    }
  
    private int RIGHT(int i) {
        return 2*i+2;
    }
  
    private void swap(int[] A, int a, int b) {
        int temp = A[a];
        A[a] = A[b];
        A[b] = temp;
    }

}

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1.插入排序—直接插入排序(Straight Insertion Sort) 基本思想: 将一个记录插入到已排序好...
    依依玖玥阅读 1,271评论 0 2
  • 概述 排序有内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部...
    蚁前阅读 5,214评论 0 52
  • 概述:排序有内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部...
    每天刷两次牙阅读 3,742评论 0 15
  • 小引 遇见你之前,岂知「不负」? ——by孙莫念 我叫孙莫念,母亲说是因为我出...
    志梅醉阅读 205评论 0 2
  • 简介 人真的应该拥有超能力吗? 拥有任何愿望都会被实现的超能力真的会幸福吗? 网络上突然出现了一个自称拥有能够让一...
    YikChan阅读 761评论 8 6