标签:logs sort size int col 空间复杂度 str 交换 void
核心代码
1 #define LEFT (2*nRootID+1) 2 #define RIGHT (2*nRootID+2) 3 4 void Adjust(int arr[], int len, int nRootID) 5 { 6 assert(arr!=NULL && len>0); 7 8 while(1) 9 { 10 //两个孩子 11 if(RIGHT < len) 12 { 13 //左比右大 14 if(arr[LEFT] > arr[RIGHT]) 15 { 16 //左比父亲大 17 if(arr[LEFT] > arr[nRootID]) 18 { 19 //交换 20 arr[LEFT] = arr[LEFT] ^ arr[nRootID]; 21 arr[nRootID] = arr[LEFT] ^ arr[nRootID]; 22 arr[LEFT] = arr[LEFT] ^ arr[nRootID]; 23 24 //被交换节点作为新的调整节点 25 nRootID = LEFT; 26 continue; 27 } 28 else 29 { 30 break; 31 } 32 } 33 else 34 { 35 //右比父亲大 36 if(arr[RIGHT] > arr[nRootID]) 37 { 38 //交换 39 arr[RIGHT] = arr[RIGHT] ^ arr[nRootID]; 40 arr[nRootID] = arr[RIGHT] ^ arr[nRootID]; 41 arr[RIGHT] = arr[RIGHT] ^ arr[nRootID]; 42 43 //被交换节点作为新的调整节点 44 nRootID = RIGHT; 45 continue; 46 } 47 else 48 { 49 break; 50 } 51 } 52 } 53 //一个孩子 54 else if(LEFT < len) 55 { 56 //左比父亲大 57 if(arr[LEFT] > arr[nRootID]) 58 { 59 //交换 60 arr[LEFT] = arr[LEFT] ^ arr[nRootID]; 61 arr[nRootID] = arr[LEFT] ^ arr[nRootID]; 62 arr[LEFT] = arr[LEFT] ^ arr[nRootID]; 63 64 //被交换节点作为新的调整节点 65 nRootID = LEFT; 66 continue; 67 } 68 else 69 { 70 break; 71 } 72 } 73 //没有孩子 74 else 75 { 76 break; 77 } 78 } 79 } 80 81 void HeapSort(int arr[], int len) 82 { 83 int i; 84 85 assert(arr!=NULL && len>0); 86 87 //建堆 88 //从最后一个父亲节点开始调整 89 for(i=len/2-1; i>=0; --i) 90 { 91 //调整 92 Adjust(arr, len, i); 93 } 94 95 //排序 96 for(i=len-1; i>0; --i) 97 { 98 //堆顶和最后位置交换 99 arr[i] = arr[i] ^ arr[0]; 100 arr[0] = arr[i] ^ arr[0]; 101 arr[i] = arr[i] ^ arr[0]; 102 103 //调整 104 Adjust(arr, i, 0); 105 } 106 }
算法分析:
最好时间复杂度:O(nlog2(n))
平均时间复杂度:O(nlog2(n))
最坏时间复杂度:O(nlog2(n))
空间复杂度:O(1)
稳定性:不稳定
标签:logs sort size int col 空间复杂度 str 交换 void
原文地址:http://www.cnblogs.com/chen-cai/p/7744960.html