1 /*
2 请设计筛选函数void sift(int a[],int k,int n),对a[k] 进行筛选,
3 并利用其设计堆排序算法函数void heapSort(int a[],int n),
4 对a[1]..a[n]进行升序排序。并测试在不同数据规模下的排序效率。(详见lab10_05.c)
5 */
6 #include "Arrayio.h"
7 #define N 10000 /*N为数据量大小,因data1.txt中只有50万个数,所以自行设定N值时需让N<=500000*/
8
9 /*请将本函数补充完整,并进行测试*/
10 void sift(int a[],int k,int n)
11 {
12 int i,j,finished;
13 i=k;j=2*i;
14 a[0]=a[k];
15 finished=0;
16 while((j<=n)&&(!finished))
17 {
18 if((j<n)&&(a[j+1]>a[j])) //判断左右子树谁的值更大
19 j++;
20 if(a[0]>=a[j])
21 finished=1;
22 else
23 {
24 a[i]=a[j];
25 i=j;j=2*j;
26 }
27 }
28 a[i]=a[0];
29 }
30
31 void heapSort(int a[],int n)
32 {
33 int i;
34 for (i=n/2;i>=1;i--)
35 sift(a,i,n);
36 for (i=n;i>1;i--) //当输出根结点后,重新调整剩余的关键字序列为一个新的大顶堆
37 {
38 a[0]=a[i];
39 a[i]=a[1];
40 a[1]=a[0];
41 sift(a,1,i-1);
42 }
43 }
44
45 int main()
46 {
47 int a[N+1],n,i; /*数据存储在a[1]...a[N]中*/
48 printf("数据初始化...\n");
49 n=readData(a,N,"data1.txt"); /*从data1.txt中读入N个整数存入数组a,n为实际读入的数据个数*/
50 printf("%d个数据排序中...\n",n);
51 heapSort(a,n);
52 saveData(a,n,"out.txt"); /*排序结果存放在out.txt文件中*/
53 printf("排序结束,排序结果保存在out.txt文件中。\n");
54 return 0;
55 }
1 #include <stdio.h>
2 #define MAX 500000
3
4 /*从文件中读入数据存入数组a*/
5 int readData(int a[], int n,char *f) /*函数返回成功读入的数据个数*/
6 {
7 FILE *fp;
8 int i;
9 fp=fopen(f,"r");
10 if (fp==NULL) return 0;
11 else
12 {
13 for (i=1;i<=n && !feof(fp);i++)
14 fscanf(fp,"%d",&a[i]);
15 fclose(fp);
16 return i-1;
17 }
18 }
19
20 /*存盘函数*/
21 void saveData(int a[],int n, char *f)
22 {
23 FILE *fp;
24 int i;
25 fp=fopen(f,"w");
26 if (fp==NULL) printf("文件建立失败!");
27 else
28 {
29 for (i=1;i<=n;i++)
30 {
31 fprintf(fp,"%7d",a[i]);
32 if (i%10==0) fprintf(fp,"%c",'\n');
33 }
34 fclose(fp);
35 }
36 }
37
38 /*输出长度为n的整型数组*/
39 void output(int a[],int n)
40 { int i;
41 printf("\n数组的内容是:\n");
42 for (i=1;i<=n;i++)
43 {
44 printf("%7d",a[i]);
45 if (i%10==0) printf("\n");
46 }
47 printf("\n");
48 }