堆排序
2017-07-14 23:07
190 查看
堆排序:将待排序的序列构造成一个大顶堆。此时整个序列的最大值就是堆顶的根节点。将它移走(与末尾元素交换,此时末尾元素就是最大值),然后将剩余的n-1个序列重新构造成一个堆,这样就会得到n个元素的次大值。如此反复执行。
时间复杂度为O(nlogn)
时间复杂度为O(nlogn)
#include<stdio.h> swap(int k[],int i,int j) { int temp; temp = k[i]; k[i] = k[j]; k[j] = temp; } void HeapAdjust(int k[],int s,int n) { int i,temp; temp = k[s]; for(i = 2*s ;i<=n;i*=2) { if(i<n && k[i] < k[i+1]) i++; if(temp >= k[i]) { break; } k[s] = k[i]; s = i; } k[s] = temp; } void HeapSort(int k[],int n) { int i; for(i = n/2;i>0;i--) { HeapAdjust(k,i,n); } for(i = n;i>1;i--) { swap(k,1,i); HeapAdjust(k,1,i-1); } } int main() { int i,a[10]={-1,2,6,0,3,9,1,7,4,8}; HeapSort(a,9); for(i = 1;i<10;i++) printf("%d",a[i]); printf("\n\n"); return 0; }