两种方法分别对应代码中的 adjust1 和 adjust2。
#include<stdio.h>
#include<stdlib.h> /* 堆排序 */
#include<time.h>
#define NUM 10
#define MAX(a,b) ((a)>(b)?(a):(b)) /*不能写成 #define MAX(a,b) (a>b?a:b)*/
#define swap(a,b) do{ int c=a;a=b;b=c;}while(0)
void adjust1(int a[], int i, int N) //这个方法不对,不是堆排序,抱歉![2014.12.17]
{
while (2 * i + 1 <= N - 1)
{
if (a[i]>a[2 * i + 1] && 2 * i + 2 <= (N - 1) && a[i]>a[2 * i + 2] || 2 * i + 2>(N - 1) && a[i]>a[2 * i + 1])
{
break;
}
else if (a[2 * i + 1]>a[i] && 2 * i + 2 <= (N - 1) && a[2 * i + 1]>a[2 * i + 2] || 2 * i + 2>(N - 1) && a[2 * i + 1]>a[i])
{
swap(a[i], a[2 * i + 1]);
}
else
{
swap(a[i], a[2 * i + 2]);
}
}
}
void adjust_2(int a[], int i, int size)
{
int R, L;
if (2 * i + 2<size)
{
R = a[2 * i + 2];
L = a[2 * i + 1];
while (a[i]<MAX(L, R))
{
if (a[i]<L)
swap(a[i], a[2 * i + 1]);
else
swap(a[i], a[2 * i + 2]);
}
}
else if (2 * i + 2 == size)
{
L = a[2 * i + 1];
if (a[i]<L)
swap(a[i], a[2 * i + 1]);
}
}
void heap_sort(int a[], int size)
{
int i, j;
for (j = size - 1; j >= 1; j--)
{
for (i = (j - 1) / 2; i >= 0; i--)
{
adjust1(a, i, j + 1);
// adjust_2(a,i,j+1);
}
swap(a[0], a[j]);
}
}
int main(int argc, char* argv[])
{
int i;
int a[NUM];
srand(time(NULL));
for (i = 0; i<NUM; i++)
{
a[i] = rand() % 100;
}
for (i = 0; i<NUM; i++)
{
printf("%-3d", a[i]);
}
printf("\n");
clock_t start, end;
// 开始时间
start = clock();
// 排序
heap_sort(a, NUM);
// 结束时间
end = clock();
printf("time:%.10f\n", (double)(end - start) / CLOCKS_PER_SEC);
for (i = 0; i<NUM; i++)
{
printf("%d ", a[i]);
}
printf("\n");
system("pause");
}