纸上得来终觉浅,绝知此事要躬行. 看完了这篇博客之后 , 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;
}