堆排序:
利用大根堆进行堆排序,将数组看成二叉树,思路就是,将数组进行排序,目标是二叉树的顶点为数组的最大值,将其与数组的最后位置进行交换,这就排好了第一个数,之后再将其排序,让顶点是剩余数组的最大值,其过程用循环,每次维度减一,同时将顶点与数组最后位置交换。
#include <iostream>//没有判断数组是否为空且维度小于2
using namespace std;
void swapvalue(int arr[],int L,int R)//交换数组值
{
int tmp=arr[L];
arr[L]=arr[R];
arr[R]=tmp;
}
void heapInsert(int arr[],int index)//第一次排好二叉树
{
while(arr[index]>arr[(index-1)/2])
{
swapvalue(arr,index,(index-1)/2);
index=(index-1)/2;
}
}
void heapify(int arr[],int index,int endline)//拿掉最大值后,剩余的数组重新排序,寻找二叉树新的最大点
{
int Left=2*index+1;
while(Left<endline)
{
int largest=(Left+1<endline)&&(arr[Left]<arr[Left+1])?Left+1:Left;
largest=(arr[largest]>arr[index])?largest:index;
if(largest==index)
{
break;
}
swapvalue(arr,largest,index);
index=largest;
Left=2*index+1;
}
}
void heap_Sort(int arr[],int index)
{
for(int i=0;i<index;i++)
heapInsert(arr,i);
swapvalue(arr,0,--index);
while(index>0)
{
heapify(arr,0,index);
swapvalue(arr,0,--index);
}