堆:(大堆,小堆):nlog2N复杂度
父节点 :farent=(i-1)/2;
子节点:c1=2*i+1;
c2=2*i+2;
堆排序:
1.heapify父节点(大小堆关系)
- build_heap 每个父节点建立
- Heapsort
#include <stdio.h>
#include <stdlib.h>
void swap(int arry[],int i,int j){ //交换
int temp;
temp=arry[i];
arry[i]=arry[j];
arry[j]=temp;
return;
}
void heapify(int *tree,int N,int i){ //父节点和子节点排序(大堆) //
if(i<N){int max=i;
int c1=2*i+1;
int c2=2*i+2;
if(c1<N&&tree[c1]>tree[max]){
max=c1;
}
if(c2<N&&tree[c2]>tree[max]){
max=c2;
}
if(max!=i){
swap(tree,max,i);
heapify(tree,N,max);
}
}
}
void build_heap(int *tree,int N){ //建立堆
int i;
int last_Node=N-1;
int parent=(last_Node-1)/2;
for(i=parent;i>=0;i--){ 3,2,1 递减
heapify(tree,N,i);
}
}
void heap_sort(int *tree,int N){ //砍断节点
int i;
build_heap(tree,N);
for(i=N-1;i>=0;i--){
swap(tree,i,0);
heapify(tree,i,0); 递归找最大
}
}
void main(){
int i;
int tree[]={4,10,3,20,1,2};
int N=6;
heap_sort(tree,N);
for(i=0;i<6;i++){
printf("%d,",tree[i]);
}
system("pause");
return;
}