1、测试代码
#include <iostream>
using namespace std;
int g_loop = 0; /* 循环计数 */
int g_move = 0; /* 数据移动次数 */
void output_info(int *buff,int len, int flag)
{
int i;
if(0 == flag)
{
cout << "before: ";
}
else
{
cout << "after: ";
}
for(i = 0; i < len; ++i)
{
cout << *(buff + i) << " ";
}
cout << endl;
}
int heapify(int buff[], int idx, int len)
{
int left = 2 * idx + 1;
int right = 2 * idx + 2;
int max_pos;
int temp;
++g_loop;
cout << "idx=" << idx << " len=" << len << endl;
if(left < len && buff[left] > buff[idx])
{
max_pos = left;
}
else
{
max_pos = idx;
}
if(right < len && buff[right] > buff[max_pos])
{
max_pos = right;
}
if(max_pos != idx)
{
++g_move;
output_info(buff, 5, 0);
/* 交换 */
temp = buff[idx];
buff[idx] = buff[max_pos];
buff[max_pos] = temp;
output_info(buff, 5, 1);
cout << " change " << endl;
heapify(buff, max_pos, len);
}
}
void buid_head(int buff[], int len)
{
int i;
for(i = len / 2; i >= 0; --i)
{
heapify(buff, i, len);
}
}
void heap_sort(int buff[], int len)
{
int i;
int temp;
cout <<"buid head:"<< endl;
output_info(buff, len, 0);
buid_head(buff,len); /* 建立一个合法的堆 */
output_info(buff, len, 1);
cout <<"buid head:"<< endl << endl;
for(i = len - 1; i >= 1; --i)
{
output_info(buff, len, 0);
/* 叶子与根交换 */
temp = buff[0];
buff[0] = buff[i];
buff[i] = temp;
output_info(buff, len, 1);
cout << "i="<< i << " root change" << endl << endl;
heapify(buff, 0, i); /* 交换 */
}
}
int main(void)
{
int array[5]= {9,8,10,6,7};
heap_sort(array, 5);
cout << endl;
cout << "move=" << g_move << endl;
cout << "loop=" << g_loop << endl;
return 0;
}
2、测试log
buid head:
before: 9 8 10 6 7
idx=2 len=5
idx=1 len=5
idx=0 len=5
before: 9 8 10 6 7
after: 10 8 9 6 7
change
idx=2 len=5
after: 10 8 9 6 7
buid head:
before: 10 8 9 6 7
after: 7 8 9 6 10
i=4 root change
idx=0 len=4
before: 7 8 9 6 10
after: 9 8 7 6 10
change
idx=2 len=4
before: 9 8 7 6 10
after: 6 8 7 9 10
i=3 root change
idx=0 len=3
before: 6 8 7 9 10
after: 8 6 7 9 10
change
idx=1 len=3
before: 8 6 7 9 10
after: 7 6 8 9 10
i=2 root change
idx=0 len=2
before: 7 6 8 9 10
after: 6 7 8 9 10
i=1 root change
idx=0 len=1
move=3
loop=10
3、算法分析
- 原地排序算法;
- 非稳定排序算法;
- 空间复杂度 O(1);
- 时间复杂度 O(nlogn)。