堆排序算法
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 }
以上是关于堆排序算法的主要内容,如果未能解决你的问题,请参考以下文章