堆排序整理如下,函数中有重复代码,为了避免多一次函数调用。
重点是堆的下滤操作
void heapSort(int a[], int len) { for (int i = len / 2 - 1; i >= 0; i--) // 利用长度除二来模拟索引,会得到中位值偏右,利用索引除二来表示索引,会得到中位值偏左 { int j, temp; temp = a[i]; j = 2 * i + 1; while (j < len) { if (j + 1 < len && a[j + 1] > a[j]) j++; if (a[j] <= temp) break; a[i] = a[j]; i = j; j = 2 * i + 1; } a[i] = temp; } for (int i = len - 1; i >= 1; i--) { swap(&a[i], &a[0]); int j, temp; temp = a[0]; j = 1; while (j < i) { if (j + 1 < len && a[j + 1] > a[j]) j++; if (a[j] <= temp) break; a[i] = a[j]; i = j; j = 2 * i + 1; } a[i] = temp; } }