堆排序-c语言算法

纸上得来终觉浅,绝知此事要躬行.  看完了这篇博客之后 , https://blog.csdn.net/u014600626/article/details/103752297 , 自然要自己实现一下看看效果了.

#import <Foundation/Foundation.h>

// 实现堆排序
// 存放数据的数组和数组中的有效数据量
int a[51] = {};
int indexNum = 0;

// 重新构造堆的方法 : 比较并调整使当前节点的值大于左右叶子
void rebuildHeap() {
    
    // 从第一个有叶子的节点开始
    for (int i = indexNum/2-1; i>=0; i--) {
        int left = 2*i+1;
        int right = 2*i+2;
        // 保证 i>左叶子,
        if (a[i]<a[left]) {
            int temp = a[i];
            a[i] = a[left];
            a[left] = temp;
        }
        // 保证i>右叶子
        if (a[i]<a[right]) {
            int temp = a[i];
            a[i] = a[right];
            a[right] = temp;
        }
        
    }
    
    
}

// 把数字放入堆中,需要重新构造堆
void push(int num) {
    a[indexNum] = num;
    indexNum ++;
    rebuildHeap();
}
// 把堆顶元素弹出,最后一个元素放到初始位置,然后重新构造堆
int pop() {
    
    if (indexNum == 0) {
        NSLog(@"已经是空堆了");
        return 0;
    }
    
    int result = a[0];
    indexNum--;
    a[0] = a[indexNum];

    rebuildHeap();
    return result;
}

void showResult() {
    
    for (int i = 0; i<indexNum; i++) {
        NSLog(@"%@",@(a[i]));
    }
    
}


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

    // 测试用例
    for (int i = 0; i<50; i++) {
        int r = arc4random() % 1000 + 1;
        push(r);
        NSLog(@"入堆的元素 : %@",@(r));
    }
    NSLog(@"----------堆中的情况");
    showResult();
    NSLog(@"----------排序结果");
    int resultArray[50] = {};
    for (int i = 0; i<50; i++) {
        int result = pop();
        resultArray[i] = result;
        NSLog(@"%@",@(result));
    }
    
    // 堆排序是结束了,但是肉眼看结果太累了,检查排序结果是否合法
    for (int i=0; i<50-1; i++) {
        
        if (resultArray[i]<resultArray[i+1]) {
            NSLog(@"出错了!!!");
        }
        
    }
    
    return 0;
}
发布了101 篇原创文章 · 获赞 33 · 访问量 24万+

猜你喜欢

转载自blog.csdn.net/u014600626/article/details/104055187