[原创]堆排序(C++版)

堆排序  时间复杂度:ON*log2N)空间复杂度:O1不稳定的

下面的方式我是通过向下调整创建大根堆,然后通过向下调整进行堆排序。

//向下调整堆
void adjustDown(int A[], int k, int len){
    int tmp = A[k];
    for (int i = 2 * k + 1; i < len; i = 2 * i + 1){
        if (i<len - 1 && A[i] < A[i + 1])
            i++;
        if (tmp >= A[i])  break;
        if (A[i] > tmp){
            A[k] = A[i];
            k = i;
        }
    }
    A[k] = tmp;
}
//初始化,建立大根堆
void buildMaxHead(int A[], int len){
    int i;
    for (i = len / 2-1; i >=0; i--)
        adjustDown(A,i,len);    
}
//以向下调整的方式进行堆排序
void heapSort(int A[], int len){
    buildMaxHead(A,len);    
    for (int i = len - 1; i > 0; i--){
        swap(A[i],A[0]);
        adjustDown(A,0,i);
    }
}

另外还可以通过向上调整,以及创建小根堆的方式来进行堆排序,下面我只列出向上调整的方法函数,至于如何通过向上调整以及创建小根堆来实现堆排序,后面有机会再补充完善在该博文中:

//向上调整
void adjustUp(int A[], int k){
    int tmp = A[k];
    int i = k / 2;
    while (i >= 0 && tmp > A[i]){
        A[k] = A[i];
        k = i;
        i = i / 2;
    }
    A[k] = tmp;
}

欢迎网友在评论中给出不同意见和看法!

 

posted on 2017-08-09 17:46  最快的方法就是最慢  阅读(207)  评论(0编辑  收藏  举报

导航