堆排序

mac2025-03-24  14

#include <stdio.h> #include <stdlib.h> //建堆,调整堆,堆排序 void swap(int arr[],int i,int j){ int temp=arr[i]; arr[i]=arr[j]; arr[j]=temp; } //heapify函数实现的是,把最大的节点调整到父节点上 void heapify(int tree[],int n,int i){ if(i>=n) return; int c1=2*i+1; int c2=2*i+2; int max=i; if(c1<n&&tree[max]<tree[c1]){ max=c1; } if(c2<n&&tree[max]<tree[c2]){ max=c2; } if(max!=i){ swap(tree,max,i); heapify(tree,n,max); } } //接下来要做的是,建堆,也就是从最后一个非叶子节点,去调整 void build_heap(int tree[],int n){ int last_node=n-1; int parent=(last_node-1)/2; int i; for(i=parent;i>=0;i--){ heapify(tree,n,i); } } //然后,进行堆排序,拿出根节点与最后一个交换,然后调整堆,继续 void heapSort(int tree[],int n){ build_heap(tree,n); int i; for(i=n-1;i>=0;i--){ swap(tree,i,0); heapify(tree,i,0); } } int main() { int tree[]={2,5,3,1,10,4}; int n=6; heapSort(tree,n); int i; for(i=0;i<n;i++){ printf("%d\n",tree[i]); } return 0; }

 

最新回复(0)