2020.3.24--------优化代码量
由于上篇文章堆排序存在大量的重复代码,因此我们可以定义一个最大值MAX.完全二叉树是从右向左依次赋空的,只有存在左孩子的情况下才会有可能存在有孩子。
1.定义MAX = Left
2.如果存在右孩子,比较左右孩子大小。如果右孩子比左孩子大,讲Right赋值给MAX
3.比较arr[MAX]与父亲节点的大小。如果比父亲节点大,交换,重新定义父亲节点
#include <stdio.h>
#define Left 2*RootId + 1
#define Right 2*RootId + 2
void AdJust2(int arr[],int len,int RootId)
{
int MAX;
for(MAX = Left;MAX < len;MAX = Left)
{
//两个孩子
if(Right < len)
{
if(arr[Left] < arr[Right])
{
MAX = Right;
}
}
if(arr[MAX] > arr[RootId])
{
arr[MAX] = arr[MAX]^arr[RootId];
arr[RootId] = arr[MAX]^arr[RootId];
arr[MAX] = arr[MAX]^arr[RootId];
RootId = MAX;
}
else
{
break;
}
}
}
void HeapSort(int arr[],int len)
{
int i;
if(arr == NULL || len <= 0)
return;
//1.初始堆---大堆
for(i = len /2 -1 ;i>=0 ;i--)
{
AdJust2(arr,len,i);
}
//2.排序
for(i = len-1;i>0;i--)
{
//交换
arr[i] = arr[i]^arr[0];
arr[0] = arr[i]^arr[0];
arr[i] = arr[i]^arr[0];
//调整栈顶
AdJust2(arr,i,0);
}
}
void Print(int arr[],int len)
{
for(int i = 0;i<len;i++)
{
printf("%d ",arr[i]);
}
}
int main()
{
int arr[] = {2,19,7,11,14,3,6,8,1};
HeapSort(arr,sizeof(arr)/sizeof(arr[0]));
Print(arr,sizeof(arr)/sizeof(arr[0]));
return 0;
}