首页 > 代码库 > 堆排序 Heapsort
堆排序 Heapsort
堆排序:
1 #include<stdio.h> 2 //#include<stdlib.h> 3 4 void PrintArray(int data[] ,int length){ 5 int i; 6 for(i=0;i<length;i++){ 7 printf("%d ",data[i]); 8 } 9 printf("\n");10 }11 12 //heap_size;堆的大小13 // 堆化,保持堆的性质14 // Max_Heapify让A[i]在最大堆中"下降",15 // 使以i为根的子树成为最大堆16 void Max_heapify( int A[] ,int i ,int heap_size){17 int l=2*i+1;//左子树下标18 int r=2*i+2;//右子树下标19 int largest,t;20 if(l<heap_size&&A[l]>A[i]){21 largest=l;22 }23 else largest=i;24 if(r<heap_size&&A[r]>A[largest]){25 largest=r;26 }27 if(largest!=i){28 t=A[i]; 29 A[i]=A[largest];30 A[largest]=t;31 Max_heapify(A,largest,heap_size);32 }33 }34 35 // 建堆36 // 自底而上地调用MaxHeapify来将一个数组a[1..size]变成一个最大堆37 Build_max_heap(int A[],int heap_size){38 int i;39 for(i=heap_size/2;i>=0;i--){40 Max_heapify(A,i,heap_size);41 }42 }43 44 // 堆排序45 // 初始调用BuildMaxHeap将a[1..size]变成最大堆46 // 因为数组最大元素在a[1],则可以通过将a[1]与a[size]互换达到正确位置47 // 现在新的根元素破坏了最大堆的性质,所以调用MaxHeapify调整,48 // 使a[1..size-1]成为最大堆,a[1]又是a[1..size-1]中的最大元素,49 // 将a[1]与a[size-1]互换达到正确位置。50 // 反复调用Heapify,使整个数组成从小到大排序。51 // 注意: 交换只是破坏了以a[1]为根的二叉树最大堆性质,它的左右子二叉树还是具备最大堆性质。52 // 这也是为何在BuildMaxHeap时需要遍历size/2到1的结点才能构成最大堆,而这里只需要堆化a[1]即可53 Heap_sort(int A[],int length){54 int i,t;55 int heap_size=length;56 Build_max_heap(A,length);57 printf("初始最大堆:\n");58 PrintArray(A,length);59 for(i=length-1;i>=1;i--){60 t=A[i];61 A[i]=A[0];62 A[0]=t;63 heap_size--;64 Max_heapify(A,0,heap_size);65 printf("中间过程:\n");66 PrintArray(A,length);67 }68 }69 70 71 72 void main(){73 int A[]={4,6,1,8,15,2,17,9,3};74 int length=sizeof(A)/sizeof(A[0]);75 Heap_sort(A,length);76 printf("\n最后结果:\n");77 PrintArray(A,length);78 }
结果:
时间复杂度为:n logn
堆排序 Heapsort
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。