堆排序
#include<bits/stdc++.h> using namespace std; void adjust_sort(int a[],int x,int n)//对长度为n的区间,第x个结点进行调整 { int l=2*x+1; int r=2*x+2;//左右子树 int max=x; if(l<n&&a[l]>a[max])max=l; if(r<n&&a[r]>a[max])max=r; if(max!=x)//如果最大值不是x 那跟最大的孩子交换 { swap(a[max],a[x]);//跟最大孩子交换 adjust_sort(a,max,n);//交换完之后调整最大孩子以下的树 } } void heap_sort(int a[],int n) { for(int i=n/2-1;i>=0;i--)//由于数组从零开始,所以减一 adjust_sort(a,i,n); for(int i=n-1;i>0;i--) { swap(a[0],a[i]);//因为是大根堆,最上边的值是最大的,所以将最大 的值放到最后边,然后调整剩余的值找下剩余数中最大值 adjust_sort(a,0,i);//将剩余的值进行调整得到最大值 } } 本质就是:通过堆的性质找到最值,进行排序,大小根堆只是得到的最值不同,导致交换位置不同而已。时间复杂度为O(nlog(n)),顺序,逆序和随机数据的时间复杂度都差不多 int main () { int a[]={8,5,4,5,7,1}; heap_sort(a,6); for(int i=0;i<6;i++) cout<<a[i]<<endl; return 0; }
对于5000个数据: 比较次数: 移动次数: 运行所花时间: