堆排序

父节点 r
左子节点2r+1
右子节点2r+2
叶节点数n/2

class Solution {
public:
    /**
     * @param A an integer array
     * @return void
     */
    void sortIntegers2(vector<int>& A) {
        // Write your code here
        /*
        vector<int>temp(A.size(),0);
        mergeSort(A,temp,0,A.size()-1);
        */
        //quickSort(A,0,A.size()-1);
        headSort(A);
    }
    
    
    void headSort(vector<int>& A){
        int n = A.size();
  //从最后一个不是叶节点的点开始调整
        for(int i = n/2-1;i>=0;i--) {
            headAdjust(A,i,n);
        }
        for(int i = n-1;i>0;i--){
            A[0] = A[i]^A[0];
            A[i] = A[i]^A[0];
            A[0] = A[i]^A[0];
            headAdjust(A,0,i);
        }
    }
    
//向下调整堆
    void headAdjust(vector<int>& A,int index,int length) {
        int i = index;
        int j = 2*index+1;
        while(j<length) {
            
            if(j+1<length&&A[j+1]>A[j]) {
                j++;
            }
            
           if(A[i]<A[j]) {
               A[i] = A[i]^A[j];
               A[j] = A[i]^A[j];
               A[i] = A[i]^A[j];
           } else {
               break;
           }
           i = j;
           j = 2*i+1;
        }
    }
}
    
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 二叉树 满二叉树 国内教程定义:一个二叉树,如果每一个层的结点数都达到最大值,则这个二叉树就是满二叉树。也就是说,...
    简_爱SimpleLove阅读 9,770评论 0 3
  • 树 在介绍对排序之前,先介绍“树”的相关概念!树:指不包含回路的连通无向图。有以下一些特性: 一棵树中的任意两个节...
    我系哆啦阅读 4,954评论 3 3
  • 上次写到了快排,接着往下讲。O(nlogn)级别的算法除了上次说的快排,归并,还有推排序。今天从先推排序开始写。堆...
    锅与盆阅读 6,504评论 0 2
  • 人人都有自己的不容易,说多了矫情。
    0639ba56d9fa阅读 1,756评论 0 0
  • 3、 企业的性质 华与华方法提出了三个重新定义:重新定义企业战略,重新定义企业社会责任,重新定义公关。 企业战略不...
    华杉2009阅读 5,457评论 2 19

友情链接更多精彩内容