堆排序算法

Posted 谦谦君子,陌上其华

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了堆排序算法相关的知识,希望对你有一定的参考价值。

 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 }

 

以上是关于堆排序算法的主要内容,如果未能解决你的问题,请参考以下文章

堆排序算法的实现

7.2堆排序的代码分析(算法基础—排序算法)

选择排序(简单选择排序堆排序的算法思想及代码实现)

算法-java代码实现堆排序

『算法设计_伪代码』堆排序

十大经典排序算法总结(堆排序)