#排序—堆排
##堆排采用简单的二叉数首先我们简单的介绍一下二叉数:
这是一个简单的二叉数(该二叉数父节点的值比子节点的大)
下面我们看一个父节点小于子节点的
二叉数可以由数组来表示
在这里圆圈里面的数表示数组的值数组的下标就是它们的序号
它们的序号有一些规律:
左子节点序号 = 父节点序号×2 +1
右子节点序号 = 父节点序号×2 +2
##下面我们简单的以图片的方式了解二叉数的原理:
##下面讲解如何操作:
首先把要排序的数变成一个二叉数,这里就不需要了,我们可以把数组看成一个二叉数
1.我们需要先把二叉数变为父节点都比子节点大的形态,
2.然后交换最上面的节点(数组中的a[0])和右下方的节点(数组中的a[n]最后一个),这样a[n]就是最大的
3.后面继续第一步,第二步(在这时不要包括a[n])
#include <stdio.h>
void swap(int A[], int i, int j) //用来交换两个数
{
int t = A[i];
A[i] = A[j];
A[j] = t;
}
void duipai(int A[],int n) //堆排
{
int k = 0,h = n;
while(k<h)
{
for(int i = n-1;i>=0;i--)
{
int s = (i-1)/2;
if(A[s] < A[i])
{
swap(A, i, s);
}
}
swap(A, 0, n-1);
n = n - 1;
k++;
}
}
int main()
{
int A[100] = {0}; //定义一个长为100的数组并初始化为0
int n;
scanf("%d",&n); // 输入数组长度
for(int i = 0;i<n;i++) //输入数组
{
scanf("%d",&A[i]);
}
duipai(A,n);
for(int j = 0;j<n;j++)
{
printf("%d\t",A[j]);
}
return 0;
}