c++堆排序,第一行,一个正整数 ,表示待排序的元素的个数。 之后的每一行,有两个正整数,分别代表着组成待排元素的主关键码和键码,
时间: 2023-10-04 11:08:27 浏览: 72
好的,针对你的问题,我可以给出一个基本的c++堆排序实现,代码如下:
```c++
#include <iostream>
using namespace std;
// 堆排序
void heap_sort(int arr[], int n) {
// 建立最大堆
for (int i = n / 2 - 1; i >= 0; i--) {
int parent = i;
int child = parent * 2 + 1;
while (child < n) {
if (child + 1 < n && arr[child] < arr[child + 1]) {
child++;
}
if (arr[child] > arr[parent]) {
swap(arr[child], arr[parent]);
parent = child;
child = parent * 2 + 1;
} else {
break;
}
}
}
// 排序
for (int i = n - 1; i > 0; i--) {
swap(arr[0], arr[i]);
int parent = 0;
int child = parent * 2 + 1;
while (child < i) {
if (child + 1 < i && arr[child] < arr[child + 1]) {
child++;
}
if (arr[child] > arr[parent]) {
swap(arr[child], arr[parent]);
parent = child;
child = parent * 2 + 1;
} else {
break;
}
}
}
}
int main() {
int n;
cin >> n;
int arr[n];
for (int i = 0; i < n; i++) {
int a, b;
cin >> a >> b;
arr[i] = a * 1000000 + b; // 组成主关键码和键码
}
heap_sort(arr, n);
for (int i = 0; i < n; i++) {
cout << arr[i] / 1000000 << " " << arr[i] % 1000000 << endl;
}
return 0;
}
```
这里我使用了一个技巧,将主关键码和键码组合成一个整数进行排序,最后输出时再拆分成两个数,这样可以方便处理。注意,这里的堆排序是基于数组的实现。
阅读全文