堆排序(Heapsort)是指利用堆积树(堆)这种数据结构所设计的一种排序算法,它是选择排序的一种。可以利用数组的特点快速定位指定索引的元素。堆分为大根堆和小根堆,是完全二叉树。大根堆的要求是每个节点的值都不大于其父节点的值,即A[PARENT[i]] >= A[i]。在数组的非降序排序中,需要使用的就是大根堆,因为根据大根堆的要求可知,最大的值一定在堆顶。
1 void heapSort(int array[],int length) 2 { 3 int i ; 4 //调整序列的前半部分元素,调整完之后第一个元素是序列的最大的元素 5 //length/2-1是最后一个非叶节点,此处"/"为整除 6 for (i = length/2 - 1; i >= 0; --i) { 7 HeapAdjust(array, i, length); 8 } 9 10 //从最后一个元素开始对序列进行调整,不断的缩小调整的范围直到第一个元素 11 for (i = length - 1; i > 0; --i) { 12 13 //把第一个元素和当前的最后一个元素交换, 14 //保证当前的最后一个位置的元素都是在现在的这个序列之中最大的 15 array[i] = array[0]^array[i]; 16 array[0] = array[0]^array[i]; 17 array[i] = array[0]^array[i]; 18 //不断缩小调整heap的范围,每一次调整完毕保证第一个元素是当前序列的最大值 19 HeapAdjust(array, 0, i); 20 } 21 } 22 23 //array是待调整的堆数组,i是待调整的数组元素的位置,nlength是数组的长度 24 //本函数功能是:根据数组array构建大根堆 25 void HeapAdjust(int array[],int i,int nLength) 26 { 27 int biggerChild; 28 int temp; 29 for (; 2*i + 1 < nLength; i = biggerChild) { 30 //左子结点的位置=2*(父结点位置)+1 31 biggerChild = 2 * i + 1; 32 //查找左右子节点中的较大值 33 if (biggerChild < nLength - 1 && array[biggerChild + 1]> array[biggerChild]) { 34 biggerChild ++; 35 } 36 //如果较大值比父节点大,则把较大值的节点交换给父节点,以完成最大堆 37 if (array[i] < array[biggerChild]) { 38 temp = array[biggerChild]; 39 array[biggerChild] = array[i]; 40 array[i] = temp; 41 } 42 else 43 { 44 break; 45 } 46 } 47 }
1 int array[] = {23,43,2,35,534,645,4,56,45,65,75,45,3,57,64}; 2 heapSort(array, sizeof(array)/sizeof(int));