//堆排序 voidheap_sort(int *begin, int *end) { int num = end - begin; //首先建立大根堆,即对 n/2 - 1 为根的子树进行调整。 for (int i = num / 2; i >= 0; i--) heap_adjust(begin, end, i, num); //循环输出最大值,并调整堆。 for (int i = 0; i <= num - 1; i++) { int temp = begin[0]; begin[0] = begin[num - i - 1]; begin[num - i - 1] = temp; heap_adjust(begin, end, 0, num - i - 1); } } //调整heap的一个子树 voidheap_adjust(int *begin, int *end, int seq, int len) { //将树根与其最大的孩子进行交换,递归直到叶子。 int temp = begin[seq]; for (int i = seq * 2 + 1; i < len; i = i * 2 + 1) { //指向大的孩子 if (i + 1 < len && begin[i] < begin[i + 1]) i++; if (temp < begin[i]) { begin[seq] = begin[i]; seq = i; } elseif (temp >= begin[i]) break; } begin[seq] = temp; }