voidheapSort(int* first, constint* last){ auto len = last - first; // 建堆
for (int i = len / 2 - 1; i >= 0; i--) heapify(first, len, i);
printf("Heap:"); for (auto i = first; i < last; i++) printf("%d ", *i); printf("\n"); // 排序 for (int i = len - 1; i > 0; i--) { swap(first[i], first[0]); heapify(first, i, 0); } }
// 用于 introSort 的分割函数, 返回, pivot 所在的指针 int* partition(int* first, int* last){ int pivot = *first; // 默认是以第一个作为枢轴量 auto p = first; // 这一段循环基本必须照着这个格式写, 不然不能 AC // 因为分组的实现方式有很多, 但是要想 AC 许多细节的地方需要注意 // 这种实现方式选择的是, 一开始 first 并不参与排序, 直到返回时, 才将 first 对应的值进行交换 while (true) { while (*(++first) <= pivot) // 少一个等号都不行! ; while (*(--last) > pivot) ; if (first >= last) { swap(*p, *last); // 这里是选择 last 与枢轴量进行交换 return last; } swap(*first, *last); } }
voidintroSort(int* first, int* last, int& depthLimit){ --depthLimit; if ((last - first) > threshold) { if (depthLimit <= 0) { heapSort(first, last); ++depthLimit; return; }
// 插入排序 voidinsertSort(int* first, constint* last){ if (first == last) return; int *i, *j; int val; for (i = first + 1; i != last; ++i) { val = *i; for (j = i - 1; j >= first && val < *j; --j) *(j + 1) = *j; *(j + 1) = val; } }
// 请在这里补充你的代码, 即你所实现的 sort 函数 voidsort(int* R, int n){ int *first = R + 1, *last = R + n + 1;
auto depthLimit = static_cast<int>(2 * (log(n) / log(2))); printf("depth_limit:%d\n", depthLimit); // 此处自加一下, 是因为, 在第一调用 introSort 时会默认递归了一次, 其实不然 introSort(first, last, ++depthLimit);
printf("Intermediate:"); for (auto p = first; p < last; ++p) printf("%d ", *p); printf("\n");