目录
1.排序原理
堆排序(Heapsort)是指利用堆积树(堆)这种数据结构所设计的一种排序算法,它是选择排序的一种。它是通过堆来进行选择数据,需要注意的是排升序要建大堆,排降序建小堆。
每调整一次,二叉树的孩子节点要少一个(并不是删除而是不在排序队列里面).
1.在这里我们需要用到向下调整的方法:代码如下
void HeapAdjust(int* arr,int size,int parent){//堆调整
int child=parent*2+1;//求出左孩子
while(child<size){//孩子的下标小于个数则继续调整
if(child+1<size&&arr[child]<arr[child+1]){//标记较大的孩子
child+=1;
}
if(arr[parent]<arr[child]){//父母比孩子小交换
Swap(&arr[parent],&arr[child]);
parent=child;//重新标记
child=parent*2+1;
}else{
return;
}
}
}
2.由于我们刚开始拿到的是数组或者链表,由此我们还需要建堆,把数组集合转换为堆这种数据结构.代码如下:
int root=(size-2)/2;//从最后一个孩子的父母节点开始
for(root;root>=0;root--){
HeapAdjust(arr,size,root);
}
3. 利用堆删除的思想来排序(不是真正的删除)
代码如下:
int end=size-1;
while(end>0){
Swap(&arr[0],&arr[end]);
HeapAdjust(arr,end,0);
end--;
}
2.完整代码如下
void Swap(int* a,int *b){//交换
int tmp=*a;
*a=*b;
*b=tmp;
}
void HeapAdjust(int* arr,int size,int parent){
int child=parent*2+1;//求出左孩子
while(child<size){
if(child+1<size&&arr[child]<arr[child+1]){//标记较大的孩子
child+=1;
}
if(arr[parent]<arr[child]){//父母比孩子小交换
Swap(&arr[parent],&arr[child]);
parent=child;
child=parent*2+1;
}else{
return;
}
}
}
void HeapSort(int* arr,int size){//堆排序---升序(大),降序(小)
//建堆
int root=(size-2)/2;//从最后一个孩子开始
for(root;root>=0;root--){
HeapAdjust(arr,size,root);
}
//删除的方法进行排序
int end=size-1;
while(end>0){
Swap(&arr[0],&arr[end]);
HeapAdjust(arr,end,0);
end--;
}
}