可能速度不是最快,但绝对好理解。(num代表数组下标,下标从0开始)
#include <iostream>
#include<vector>
using namespace std;
void swap(int a[], int i, int j)
{
int temp = a[i];
a[i] = a[j];
a[j] = temp;
}
void duitiaozheng(int a[], int i, int num)
{
int max;
while (i <= (num - 1) / 2)
{
if (2 * i + 2 <= num)
{
if (a[2 * i + 1] < a[2 * i + 2])
{
max = 2 * i + 2;
}
else
{
max = 2 * i + 1;
}
}
else
{
max = 2 * i + 1;
}
if (a[i] >= a[max])
{
break;
}
swap(a, i, max);
i = max;
}
}
void duipaixu(int a[],int num)
{
for (int i = (num - 1) / 2; i >= 0; i--)
{
duitiaozheng(a, i, num);
}
swap(a, 0, num);
for (int i=num-1;i>=1;i--)
{
duitiaozheng(a, 0, i);
swap(a, 0, i );
}
}
int main()
{
int a[] = {12,21,5,78,9,23,46,7854,32,0,17238};
duipaixu(a,10);
std::cout << a[0]<<endl;
std::cout << a[1] << endl;
std::cout << a[2] << endl;
std::cout << a[3] << endl;
std::cout << a[4] << endl;
std::cout << a[5] << endl;
std::cout << a[6] << endl;
std::cout << a[7] << endl;
std::cout << a[8] << endl;
std::cout << a[9] << endl;
std::cout << a[10] << endl;
}
结果如下: