堆排序的原理:如果是按升序排。首先把数组建为最小堆,最小堆的根结点a[1]一定是数组中的最小值.所以每次把根结点a[1]与a[n]交换。在把剩余的元素再建为最小堆,在把a[1]与a[n-1]交换。重复次过程n次。
代码如下:
#include <iostream>
#include <cmath>
#define mx 50
using namespace std;
int a[mx] ;
int n ;
void adjust(int i , int j)
{
int child ;
while(i <= j / 2)
{
child = 2 * i ;
if(child + 1 <= j && a[child] > a[child + 1])
{
child ++;
}
if(a[i] > a[child])
swap(a[i] , a[child]) ;
else
return ;
i = child ;
}
}
int main()
{
while(cin >>n)
{
for(int i = 1; i <= n; i ++)
cin >> a[i] ;
for(int i = n; i >= 1; i --)
{
for(int j = i/2; j >= 1; j --)
{
adjust(j , i);
}
swap(a[1] , a[i]) ;
}
cout << "---------------" << endl;
for(int i = 1; i <=n; i ++)
cout << a[i] <<" ";
cout << endl;
}
return 0 ;
}
按升序的做法与上面的类似。
每次建最大堆。则a[1]是数组中的最大值。
第一次a[1] <--->a[n]
第二次a[1] <--->a[n-1]
第三次a[1] <--->a[n-2]
第四次a[1] <--->a[n-3]
.........
代码如下:
#include <iostream>
#include <cmath>
#define mx 50
using namespace std;
int a[mx] ;
int n ;
void adjust(int i , int j)
{
int child ;
while(i <= j / 2)
{
child = 2 * i ;
if(child + 1 <= j && a[child] < a[child + 1])
{
child ++;
}
if(a[i] < a[child])
swap(a[i] , a[child]) ;
else
return ;
i = child ;
}
}
int main()
{
while(cin >>n)
{
for(int i = 1; i <= n; i ++)
cin >> a[i] ;
for(int i = n; i >= 1; i --)
{
for(int j = i/2; j >= 1; j --)
{
adjust(j , i);
}
swap(a[1] , a[i]) ;
}
cout << "---------------" << endl;
for(int i = 1; i <=n; i ++)
cout << a[i] <<" ";
cout << endl;
}
return 0 ;
}