标签:after class ++ 技术分享 假设 定义 这一 数组 思路
堆是一种类似二叉树的数据结构,分为最大堆和最小堆,最大堆得定义是当前节点必须大于左右子节点,堆中所有节点都要符合这个定义。最小堆反之。这一点不同于二叉树排序。假设有数组int a[10] = {90,45,21,43,22,77,13,89,56,84},根据最大堆来初始化数组
最大堆初始化代码思路:用数组最后一个元素来确定最后一个子节点,根据子节点来找到其父节点。先比较左右子节点确定最大子节点,如果父节点大于则不用互换,否则父节点与最大子节点互换。然后父节点减一(利用数组的顺序依次递减来操作所有节点)。当然利用for循环来使父节点的所有子节点(包括子节点的子节点)都符合最大堆的定义。
1 void maxheap_sortDown(int a[],int start,int end){ 2 3 int code = start; 4 int lchild = code*2+1; 5 int temp = a[code]; 6 7 for(;lchild<=end;code = lchild,lchild = code*2+1){ 8 9 if(lchild<end && a[lchild]>a[lchild+1]) 10 lchild++; //确定最大子节点,很巧妙 11 12 if(a[code]<a[lchild]) 13 break; 14 else{ 15 a[code] = a[lchild]; 16 a[lchild] = temp; 17 } 18 19 } 20 21 } 22 23 void maxheap_sortUp(int a[],int start,int end){ 24 25 int code = start; 26 int lchild = code*2+1; 27 int temp = a[code]; 28 29 for(;lchild<=end;code = lchild,lchild = code*2+1){ 30 31 if(lchild<end && a[lchild]<a[lchild+1]) 32 lchild++; //确定最大子节点,很巧妙 33 34 if(a[code]>a[lchild]) 35 break; 36 else{ 37 a[code] = a[lchild]; 38 a[lchild] = temp; 39 } 40 41 } 42 43 }
堆排序思路:把堆顶的元素与最后一个元素进行互换,互换之后在把除最后一个元素外的所有元素进行堆的定义操作,使其符合最大(小)堆。然后在互换元素,使除最后两个元素外的所有元素进行堆的定义操作,依次进行则排序完成。
1 void maxheap_sort(int a[],int n){ 2 3 int i; 4 for(i=(n-1)/2;i>=0;i--) 5 // maxheap_sortUp(a,i,n); 6 maxheap_sortDown(a,i,n); 7 8 int temp = a[0]; 9 a[0] = a[n]; 10 a[n] = temp; 11 12 for(i=n/2-1;i>=0;i--) 13 // maxheap_sortUp(a,i,n-1); 14 maxheap_sortDown(a,i,n-1); 15 16 }
测试:
1 void main(){ 2 3 void maxheap_sort(int a[],int n); 4 void maxheap_sortUp(int a[],int start,int end); 5 6 int a[10] = {90,45,21,43,22,77,13,89,56,84}; 7 int i; 8 printf("before:"); 9 for(i=0;i<10;i++){ 10 printf("%d ",a[i]); 11 } 12 13 14 printf("\n"); 15 16 for(i=9;i>=0;i--) 17 maxheap_sort(a,i); 18 19 printf("after:"); 20 for(i=0;i<10;i++){ 21 printf("%d ",a[i]); 22 } 23 24 25 }
标签:after class ++ 技术分享 假设 定义 这一 数组 思路
原文地址:https://www.cnblogs.com/lsy-lsy/p/10103718.html