树型选择排序也称作锦标赛排序(Tournament Tree Sort)。 树型选择排序基本思想: (1)先把待排序的n个记录的关键字两两进行比较,取出较小者。然后再在[n/2](向下取整)个较小者中,采用同样的方法进行比较选出每两个中的较小者,如此反复,直至选出最小关键字记录为止。 (2)用一棵有n个结点的树来表示,选出的最小关键字记录就是这棵树的根结点。 (3)在输出最小关键字之后,为选出次小关键字,将根结点即最小关键字记录所对应的叶子结点的关键字的值置为∞。 (4)然后从该叶子结点开始和其兄弟结点的关键字比较,修改从该叶结点到根结点路径上各结点的值,则根结点的值即为次小关键字。 (5)重复上述的过程,直到所有的记录全部输出为止。 下面给出完整的树型排序算法Tree_Sort函数以及测试该算法用的主函数,但其中有一处空格和一些错误,请上机调试,填充空格并修改其中的错误。 #include "stdio.h" #define MAX 32768 int s; int Tree_Sort(int *a,int n) { int i,b[n/2]; if(n == 1) {s= ;} else { for(i = 0;i < n;i = i+2) { if( (i+1)<n && a[i] > a[i+1]) { b[i/2] = a[i+1]; } else { b[i/2]= a[i]; } } Tree_Sort(b,n/2); } } int main() { int n; printf("请输入待排序的数据个数:"); scanf("%d",&n); int a[n],b[n],i,k=0,m; printf("\n请依次输入待排序的数据\n"); for(i = 0;i < n;i++) { scanf("%d",a[i]); } while(k < n) { Tree_Sort(a,n); b[k] = s; k++; for(i = 0;i < n;i++) { if(a[i] == s) { a[i] = MAX; break; } } } for(i = 0;i < n;i++) { printf("%d\t",b[i]); } getchar(); getchar(); }
时间: 2023-07-16 21:13:44 浏览: 83
树选排序,竞标赛排序,树形选择排序
下面是填空和修改后的代码:
```c
#include "stdio.h"
#define MAX 32768
int s;
void Tree_Sort(int *a, int n) { // 修改1:函数返回类型应为 void
int i, b[n / 2];
if (n == 1) {
s = a[0]; // 填空1:直接将剩下的一个元素赋值给 s
} else {
for (i = 0; i < n; i = i + 2) {
if ((i + 1) < n && a[i] > a[i + 1]) {
b[i / 2] = a[i + 1];
} else {
b[i / 2] = a[i];
}
}
Tree_Sort(b, n / 2);
s = b[0]; // 修改2:最小值是 b[0] 而不是 a[0]
for (i = 0; i < n; i++) {
if (a[i] == s) {
a[i] = MAX;
break;
}
}
}
}
int main() {
int n;
printf("请输入待排序的数据个数:");
scanf("%d", &n);
int a[n], b[n], i, k = 0, m;
printf("\n请依次输入待排序的数据\n");
for (i = 0; i < n; i++) {
scanf("%d", &a[i]); // 修改3:应该取地址符 &
}
while (k < n) {
Tree_Sort(a, n);
b[k] = s;
k++;
}
printf("排序后的结果为:");
for (i = 0; i < n; i++) {
printf("%d\t", b[i]);
}
return 0; // 修改4:添加返回值
}
```
主要修改:
1. 函数 Tree_Sort 的返回类型应为 void,因为它直接修改了全局变量 s。
2. 在递归调用 Tree_Sort 后,最小值应该是 b[0] 而不是 a[0]。
3. 在输入待排序的数据时,应该取地址符 &。
4. 主函数应该有返回值。
阅读全文