堆排序

1 排序思想:

将排序表的n个记录按照关键字建成堆,堆顶元素就是选择出的最大(或最小)记录,这样就得到排序的第一个记录。再将剩下的n-1个记录建成堆,得到次大(或者次小)的记录。如此反复,直到执行n-1次后,排序结束。

大顶堆的性质:R[i]>=R[2i]且R[i]>=R[2i+1]

2 算法实现:

// 堆排序
void heap_sort(int num[], int n){
    int i;
    // 将num[]调整成大顶堆
    // 即num[i]>=num[2i]&&num[i]>=num[2i+1]
    for(i=n/2;i>=0;i--){
        heap_adjust(num,i,n);
    }
    for(i=n-1;i>0;i--){
        // 将每一轮的堆顶放在i
        SWAP(num[0],num[i]);
        // 再将剩下的i个记录调整成大顶堆
        heap_adjust(num,0,i);
    }
}
// 将num[s,q)段调整成大顶堆
// num[s]>=num[2s]且num[s]>=num[2s+1]
void heap_adjust(int num[],int s,int q){
    int rc=num[s];
    int i;
    for(i=2*s;i<q;i*=2){
        if(i<q-1&&num[i]<num[i+1])
            i++;
        if(rc>=num[i])
            break; // rc应当放在位置s
        num[s]=num[i];
        s=i;
    }
    num[s]=rc;
}
#define SWAP(x,y) {int t; t = x; x = y; y = t;}

3 性能分析:

3.1 空间复杂度:O(1)

3.2 时间复杂度:平均和最坏时间复杂度是O(nlogn)

3.3 稳定性:不稳定

你可能感兴趣的:(排序,堆排序)