码迷,mamicode.com
首页 > 编程语言 > 详细

堆排序算法

时间:2016-12-23 14:20:10      阅读:213      评论:0      收藏:0      [点我收藏+]

标签:array   设计   左右子树   保存   scan   log   sift   利用   open   

 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 }

 

堆排序算法

标签:array   设计   左右子树   保存   scan   log   sift   利用   open   

原文地址:http://www.cnblogs.com/zyb993963526/p/6214400.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!