#include <stdio.h>
#include <windows.h>
void HeapSort(int a[], int n);
void Heapify(int a[], int i, int n);//递归
void HeapAdjust(int a[], int i, int n);//非递归
void swap(int a[], int i, int j);
int main(void)
{
int n, i;
scanf("%d", &n);
int * a = (int*)malloc(sizeof(int)*n);
for(i = 0; i < n; i++)
scanf("%d", &a[i]);
for(i = 0; i < n; i++)
printf("%d ", a[i]);
printf("\n");
HeapSort(a, n);
for(i = 0; i < n; i++)
printf("%d ", a[i]);
printf("\n");
free(a);
system("pause");
return 0;
}
void HeapSort(int a[], int n)
{
for(int i = n/2-1; i >= 0; i--)
{
HeapAdjust(a, i, n);
}
for(int j = n-1; j > 0; j--)
{
swap(a, 0, j);
HeapAdjust(a, 0, j);
}
}
//非递归
void HeapAdjust(int a[], int i, int n)
{
int temp = a[i];
for(int j = 2*i+1; j < n; j = 2*i+1)
{
if(j < n-1 && a[j] < a[j+1])
j++;
if(temp > a[j])
break;
a[i] = a[j];
i = j;
}
a[i] = temp;
}
//递归
void Heapify(int a[], int i, int n)
{
int left = 2*i+1;
int right = 2*i+2;
int max = i;
if(left < n && a[left] > a[max])
max = left;
if(right < n && a[right] > a[max])
max = right;
if(i != max)
{
swap(a, i, max);
Heapify(a, max, n);
}
}
void swap(int a[], int i, int j)
{
int temp = a[i];
a[i] = a[j];
a[j] = temp;
}
C语言排序算法(6)- 堆排序
于 2022-03-07 22:50:21 首次发布