优化代码实现 (1)先把待排序的n个记录的关键字两两进行比较,取出较小者。然后再在[n/2](向下取整)个较小者中,采用同样的方法进行比较选出每两个中的较小者,如此反复,直至选出最小关键字记录为止。 (2)用一棵有n个结点的树来表示,选出的最小关键字记录就是这棵树的根结点。 (3)在输出最小关键字之后,为选出次小关键字,将根结点即最小关键字记录所对应的叶子结点的关键字的值置为∞。 (4)然后从该叶子结点开始和其兄弟结点的关键字比较,修改从该叶结点到根结点路径上各结点的值,则根结点的值即为次小关键字。 (5)重复上述的过程,直到所有的记录全部输出为止。#include "stdio.h" #define MAX 32768 int s; void Tree_Sort(int *a,int n) { //函数返回值应该为void,而不是int int i,b[n/2]; if(n == 1) { s= a[0]; //将最小值存入全局变量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); for(i = 0;i < n;i++) { //将a数组中对应的最小值位置赋值为MAX 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]); //修正了输入格式 } while(k < n) { Tree_Sort(a,n); b[k] = s; k++; } for(i = 0;i < n;i++) { printf("%d\t",b[i]); } getchar(); getchar(); return 0; //添加返回值 }
时间: 2023-06-12 16:08:20 浏览: 50
以下是优化后的代码:
#include <stdio.h>
#define MAX 32768
void Tree_Sort(int *a, int n) {
if (n == 1) {
return; // 递归结束条件改为 n == 1,直接返回
}
int i, b[n/2], s = MAX; // s 的初始值设为 MAX
for (i = 0; i < n; i = i+2) {
if ((i+1) < n && a[i] > a[i+1]) {
b[i/2] = a[i+1];
if (b[i/2] < s) { // 记录最小值
s = b[i/2];
}
} else {
b[i/2] = a[i];
if (b[i/2] < s) {
s = b[i/2];
}
}
}
Tree_Sort(b, n/2);
for (i = 0; i < n; i++) {
if (a[i] == s) {
a[i] = MAX;
break;
}
}
Tree_Sort(a, n); // 递归调用自身,不需要使用 while 循环
}
int main() {
int n;
printf("请输入待排序的数据个数:");
scanf("%d", &n);
int a[n], b[n], i;
printf("\n请依次输入待排序的数据\n");
for (i = 0; i < n; i++) {
scanf("%d", &a[i]);
}
Tree_Sort(a, n);
for (i = 0; i < n; i++) {
printf("%d\t", a[i]);
}
getchar();
getchar();
return 0;
}
主要优化点如下:
1. 修正了函数返回值类型为 void,而不是 int。
2. 修正了递归结束条件,直接返回。
3. 在第一次对 b 数组赋值时,记录最小值 s。
4. 修正了循环结束条件,不需要使用 while 循环。
5. 在 main 函数中只需要调用一次 Tree_Sort 函数即可。
6. 去除了无用的变量和代码。