深入淺出理解排序算法之-堆排序

#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,constchar * 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");

    

    

    return0;

}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章