Loading docs/basic/heap-sort.md +25 −25 Original line number Diff line number Diff line Loading @@ -13,8 +13,7 @@ ```cpp //这里 floor 函数将实数映射到最小的前导整数。 iParent(i) = floor((i - 1) / 2) iLeftChild(i) = 2 * i + 1 iRightChild(i) = 2 * i + 2 iLeftChild(i) = 2 * i + 1 iRightChild(i) = 2 * i + 2 ``` ## 性质 Loading @@ -37,9 +36,11 @@ void max_heapify(int arr[], int start, int end) { int dad = start; int son = dad * 2 + 1; while (son <= end) { // 子结点指标在范围内才做比较 if (son + 1 <= end && arr[son] < arr[son + 1]) // 先比较两个子结点大小,选择最大的 if (son + 1 <= end && arr[son] < arr[son + 1]) // 先比较两个子结点大小,选择最大的 son++; if (arr[dad] > arr[son]) // 如果父结点比子结点大,代表调整完毕,直接跳出函数 if (arr[dad] > arr[son]) // 如果父结点比子结点大,代表调整完毕,直接跳出函数 return; else { // 否则交换父子内容,子结点再和孙结点比较 swap(arr[dad], arr[son]); Loading @@ -51,8 +52,7 @@ void max_heapify(int arr[], int start, int end) { void heap_sort(int arr[], int len) { // 初始化,i 从最后一个父结点开始调整 for (int i = len / 2 - 1; i >= 0; i--) max_heapify(arr, i, len - 1); for (int i = len / 2 - 1; i >= 0; i--) max_heapify(arr, i, len - 1); // 先将第一个元素和已经排好的元素前一位做交换,再重新调整(刚调整的元素之前的元素),直到排序完毕 for (int i = len - 1; i > 0; i--) { swap(arr[0], arr[i]); Loading Loading
docs/basic/heap-sort.md +25 −25 Original line number Diff line number Diff line Loading @@ -13,8 +13,7 @@ ```cpp //这里 floor 函数将实数映射到最小的前导整数。 iParent(i) = floor((i - 1) / 2) iLeftChild(i) = 2 * i + 1 iRightChild(i) = 2 * i + 2 iLeftChild(i) = 2 * i + 1 iRightChild(i) = 2 * i + 2 ``` ## 性质 Loading @@ -37,9 +36,11 @@ void max_heapify(int arr[], int start, int end) { int dad = start; int son = dad * 2 + 1; while (son <= end) { // 子结点指标在范围内才做比较 if (son + 1 <= end && arr[son] < arr[son + 1]) // 先比较两个子结点大小,选择最大的 if (son + 1 <= end && arr[son] < arr[son + 1]) // 先比较两个子结点大小,选择最大的 son++; if (arr[dad] > arr[son]) // 如果父结点比子结点大,代表调整完毕,直接跳出函数 if (arr[dad] > arr[son]) // 如果父结点比子结点大,代表调整完毕,直接跳出函数 return; else { // 否则交换父子内容,子结点再和孙结点比较 swap(arr[dad], arr[son]); Loading @@ -51,8 +52,7 @@ void max_heapify(int arr[], int start, int end) { void heap_sort(int arr[], int len) { // 初始化,i 从最后一个父结点开始调整 for (int i = len / 2 - 1; i >= 0; i--) max_heapify(arr, i, len - 1); for (int i = len / 2 - 1; i >= 0; i--) max_heapify(arr, i, len - 1); // 先将第一个元素和已经排好的元素前一位做交换,再重新调整(刚调整的元素之前的元素),直到排序完毕 for (int i = len - 1; i > 0; i--) { swap(arr[0], arr[i]); Loading