堆排序
#include<iostream> #include<vector> #include<set> #include<cmath> using namespace std; int lChild(int i) { return 2*i; } int rChild(int i) { return 2*i + 1; } void swap(int &a, int &b) { int t = a; a = b; b = t; } //min-heap void sift_down(int a[], int n, int i) { int min = i; int l = lChild(i); int r = rChild(i); if(l<=n && a[l]<a[min]) min = l; if(r<=n && a[r]<a[min]) min = r; if(i != min) { swap(a[i], a[min]); sift_down(a,n,min); } } void make_heap(int a[], int n) { int i = 0; for(i=1; i<=n/2; i++) { sift_down(a,n,i); } } void heap_sort(int a[], int n) { make_heap(a,n); int size = n; int i = 0; for(i=n; i>=1; i--) { swap(a[i],a[1]); size--; sift_down(a,size,1); } } int main() { int a[100]; int n; while(cin>>n) { int i = 0; for(i=1; i<=n; i++) cin>>a[i]; heap_sort(a,n); for(i=1; i<=n; i++) cout<<a[i]<<" "; cout<<endl; } return 0; }
多学习,多总结。