堆排序

来源:互联网 发布:cd.java.tedu.cn v 编辑:程序博客网 时间:2024/06/08 16:29

堆排序:根据输入数据,利用堆的调整算法形成初始堆,然后交换根元素与尾元素,总的元素个数减1,然后从根往下调整。堆排序的最好、最坏、平均时间复杂度都为O(nlogn)

# include <stdio.h>void heap_adjust(int a[],int i,int len);void heap_sort(int a[],int len);int main (void){int a[]={1,6,46,132,464,3541,654,131,56,41};heap_sort(a,sizeof(a)/sizeof(a[0]));for (int i=0; i<sizeof(a)/sizeof(a[0]); ++i)printf ("%d ",a[i]);return 0;}void heap_adjust(int a[],int i,int len)//整理函数 {int nchild;int temp;for (;2*i+1 < len;i = nchild){nchild = 2*i+1;//子节点在数组中的位置 if (nchild < len-1 && a[nchild] < a[nchild+1])//找到最大的子节点 ++nchild;if (a[i] < a[nchild]) //父节点要大于子节点   {temp = a[i];//进行交换 a[i] = a[nchild];a[nchild] = temp;}elsebreak;}}void heap_sort(int a[],int len)//堆排序 {int i;for (i=len/2-1;i>=0;--i)//将整个数组的数字进行整理 heap_adjust(a,i,len);for (i=len-1;i>0;--i)//逐步缩小范围 {int temp = a[0];a[0] = a[i];a[i] = temp;heap_adjust(a,0,i);//对根节点进行调整 }}


1 0
原创粉丝点击