您的位置:首页 > 其它

排序——堆排序

2017-06-19 00:09 246 查看
#include <iostream>
using namespace std;

void swap( int k[], int i,int j )
{
int temp;

temp = k[i];
k[i] = k[j];
k[j] = temp;
}

void HeapAdjust( int k[], int s,int n )
{
int i,temp;

temp = k[s];//存放当前要调整的结点

for( i=2*s; i <= n;i*=2 )//2*s就是左孩子 2*s+1就是右孩子 i*=2表示调到下一个树
{
if( i < n && k[i] < k[i+1] )//确定不是最后一个结点 和 如果右孩子要大过左孩子
{
i++;
}

if( temp >= k[i])
{
break;
}

k[s] = k[i];
s = i;

}

k[s] = temp;
}

void HeapSort( int k[], int n )
{
int i;

for( i=n/2; i > 0;i-- ) //
{
HeapAdjust( k, i, n );//调整大顶堆  k表示数组 i表示双亲结点 n个数
}

for( i=n; i > 1;i-- )
{
swap(k, 1, i);//互换 元素
HeapAdjust( k, 1, i-1 );
}
}

int main()
{
int i ,a[10] = {-1,5,2,6,0,3,9,1,7,4};

HeapSort(a,9);

for( i=1; i < 10 ;i++ )
{
cout << a[i];
}

cout << endl;

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: