码迷,mamicode.com
首页 > 其他好文 > 详细

深入浅出排序算法之-堆排序

时间:2014-09-30 23:06:50      阅读:266      评论:0      收藏:0      [点我收藏+]

标签:堆排序

#include <iostream>



void Swap(int &a,int &b){

    int temp;

    temp = a;

    a = b;

    b = temp;

}


// 维护最小堆

void AdjustMinHeap(int *a,int pos,int len){

    int temp,child;

    

    for (temp = a[pos]; 2*pos + 1 <= len; pos = child) {        // 不断下移父结点,直到结束

        // 左孩子(因为第一个结点是从0开始的)

        child = 2*pos + 1;

        if (child < len && a[child] > a[child + 1]) // 选取左右孩子中的最小值,a[pos]temp父亲,a[child]左孩子,a[child+1]右孩子

            child++;

        if (temp > a[child]) {      // 如果父结点>最小值,将将父节点赋予最小值

            a[pos] = a[child];

        } else {

            break;

        }

    }

    a[pos] = temp;

}


/* 堆排序

 

 基本思想:对于n个元素的序列进行堆排序,先将其建成堆(最小堆:上一层的比本层小,一次递推)。以根结点与第n个结点交换,调整前n1个结点成为堆,再以根节点与第n-1个结点进行交换,重复上述操作,直到整个序列有序。

 特点:时间复杂度:O(nlogn)

 */

void MyMinHeapSort(int *array,int len){

    int i;

    for (i = len/2-1; i >= 0;i--)           // 先初建堆

        AdjustMinHeap(array, i, len - 1);

    

    for (i = len - 1; i >= 0; i--) {

        Swap(array[i],array[0]);            // 取出堆顶元素(也就是最小元素array[0],放到数组第i)

        AdjustMinHeap(array, 0, i-1);       // 然后对前i-1位数组重建堆(重建后堆顶为最小元素)

        

    }

}


int main(int argc, const char * argv[])

{

    int i;

    int array[] = {0,13,1,14,27,18};

    int length = sizeof(array)/sizeof(array[0]);

    

    // 堆排序

    MyMinHeapSort(array, length);

    

    for (i = 0; i < length; i++){

        printf("%d ",array[i]);

    }

    printf("\n");

    

    

    return 0;

}


深入浅出排序算法之-堆排序

标签:堆排序

原文地址:http://blog.csdn.net/paulery2012/article/details/39700397

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!