#include <stdio.h>
#include <stdlib.h>
//堆排序,查找最大值,最小值速度最快
//取最大值,取最小值怎么写
//大顶堆,小顶堆。
void show(int *p, int n)
{
for (int i = 0; i < n;i++)
{
printf("%4d", p[i]);
}
printf("\n");
}
void findmax(int *arr,int size)
{
printf("start:%d\n",size);
for (int j = size - 1; j > 0;j--)//从尾部循环到头部 ,自下而上
{
int parent = j / 2;
int child = j; //记录当前下标
if (j<size -1 && arr[j]<arr[j+1]) //用该方式取出左右两个值中的最大值
{
child++;
}
if (arr[child] > arr[parent])//最大值登顶
{
int temp = arr[child];
arr[child] = arr[parent];
arr[parent] = temp;
}
printf("j=%d\n", j);
printf("parent=%d\n", parent);
printf("child=%d\n", child);
}
}
void heapsortbyaddr(int *arr, int size)//地址变化,长度变化
{
for (int i = 0; i < 10;i++)
{
findmax(arr+i, size-i); //
show(arr, 10);
}
}
void heapsort(int *arr, int size)//地址固定,额外交换数据
{
for (int j = size; j > 0;j--)
{
findmax(arr, j);
show(arr, 10);
int temp = arr[0];
arr[0] = arr[j - 1];
arr[j - 1]=temp;
show(arr, 10);
}
}
void main()
{
int a[10] = { 10, 13, 120, 12, 30, 114, 50, 19, 60, 29 };
//show(a, 10);
//findmax(a, 10);
show(a, 10);
show(a, 10);
heapsortbyaddr(a, 10);
show(a, 10);
system("pause");
}