堆排序
前不久,我们数据结构刚刚学习到,堆排序。个人觉得堆排序比较好,因为比较稳定的时间复杂度。n(logn) 时间复杂度。
如果想要学会堆排序,需要知道,二叉树。堆就和二叉树长的一模一样。
下面说说堆排序:
堆排序的思想就是用到堆的特点, 大顶堆,小顶堆,简单说,
大顶堆就是:这一棵完全二叉树的任意一个节点都满足该节点的值大于等于他的左右孩子节点,
小顶堆: 一棵完全二叉树的任意一个节点都满足该节点的值小于等于他的左右孩子节点,
因为这棵树的根节点是这棵树(堆) 中,如果是大顶堆就是max,小顶堆就是min,
比如我已大顶堆为例讲一下,大顶堆的个人根节点是最大值,只需要将根节点与最后一个数换一下,然后,把最后一个数除开不看,剩下的n-1个数字也是一棵完全二叉树,再将这棵树维护成大顶堆,不断重复到最后,就排好序了。
这样便得到一个虫小到大的数组。OVER
/****************** Heap Sort ******************/ #include<iostream> #include<stdio.h> #include<string.h> #include<algorithm> using namespace std; void BigHeap(int *a,int i,int len)//维护堆 { int l=(i<<1)+1,r=(i<<1)+2; int temp=a[i],flag=0; if(i<len/2) { if(l<len&&a[l]>temp) { flag=l; temp=a[l]; } if(r<len&&a[r]>temp) { flag=r; } } if(flag) { swap(a[i],a[flag]); BigHeap(a,flag,len); } } void BuildHeap(int *a,int len)// 构建初始堆 { for(int i=len/2-1; i>=0; i--) { BigHeap(a,i,len); } } void HeapSort(int *a,int len) { BuildHeap(a,len); for(int i=len; i>0; i--) { swap(a[0],a[i-1]); BigHeap(a,0,i-1); } } int main() { int n; while(cin>>n) { int a[1000]; for(int i=0; i<n; i++) cin>>a[i]; HeapSort(a,n); int flag=0,tp=a[0]; for(int i=1; i<n; i++) { if(a[i]<a[i-1]) { flag=1; break; } } //for(int i=0;i<n;i++) if(flag) printf("erorr "); else printf("Accepted "); } return 0; }