堆排序算法
2016-12-23 12:42
253 查看
/* 请设计筛选函数void sift(int a[],int k,int n),对a[k] 进行筛选, 并利用其设计堆排序算法函数void heapSort(int a[],int n), 对a[1]..a 进行升序排序。并测试在不同数据规模下的排序效率。(详见lab10_05.c) */ #include "Arrayio.h" #define N 10000 /*N为数据量大小,因data1.txt中只有50万个数,所以自行设定N值时需让N<=500000*/ /*请将本函数补充完整,并进行测试*/ void sift(int a[],int k,int n) { int i,j,finished; i=k;j=2*i; a[0]=a[k]; finished=0; while((j<=n)&&(!finished)) { if((j<n)&&(a[j+1]>a[j])) //判断左右子树谁的值更大 j++; if(a[0]>=a[j]) finished=1; else { a[i]=a[j]; i=j;j=2*j; } } a[i]=a[0]; } void heapSort(int a[],int n) { int i; for (i=n/2;i>=1;i--) sift(a,i,n); for (i=n;i>1;i--) //当输出根结点后,重新调整剩余的关键字序列为一个新的大顶堆 { a[0]=a[i]; a[i]=a[1]; a[1]=a[0]; sift(a,1,i-1); } } int main() { int a[N+1],n,i; /*数据存储在a[1]...a 中*/ printf("数据初始化...\n"); n=readData(a,N,"data1.txt"); /*从data1.txt中读入N个整数存入数组a,n为实际读入的数据个数*/ printf("%d个数据排序中...\n",n); heapSort(a,n); saveData(a,n,"out.txt"); /*排序结果存放在out.txt文件中*/ printf("排序结束,排序结果保存在out.txt文件中。\n"); return 0; }
#include <stdio.h> #define MAX 500000 /*从文件中读入数据存入数组a*/ int readData(int a[], int n,char *f) /*函数返回成功读入的数据个数*/ { FILE *fp; int i; fp=fopen(f,"r"); if (fp==NULL) return 0; else { for (i=1;i<=n && !feof(fp);i++) fscanf(fp,"%d",&a[i]); fclose(fp); return i-1; } } /*存盘函数*/ void saveData(int a[],int n, char *f) { FILE *fp; int i; fp=fopen(f,"w"); if (fp==NULL) printf("文件建立失败!"); else { for (i=1;i<=n;i++) { fprintf(fp,"%7d",a[i]); if (i%10==0) fprintf(fp,"%c",'\n'); } fclose(fp); } } /*输出长度为n的整型数组*/ void output(int a[],int n) { int i; printf("\n数组的内容是:\n"); for (i=1;i<=n;i++) { printf("%7d",a[i]); if (i%10==0) printf("\n"); } printf("\n"); }
相关文章推荐
- STL数学算法及堆排序算法
- 堆排序算法
- 堆排序算法(C#实现)
- java.util.TaskQueue的最小堆排序算法的应用
- 堆排序算法(c语言)
- 堆排序算法
- 堆排序算法
- 堆排序算法 总结
- 堆排序算法解析
- 堆排序算法二(堆排序算法的应用)
- 程序员必须掌握的十种算法---堆排序算法
- [Python标准库]heapq——堆排序算法
- 需要手写的算法之-----堆排序算法
- 堆排序算法原理,实现及时间复杂度分析
- Heapsort 堆排序算法详解(Java实现)
- 堆排序算法
- C语言实现堆排序算法
- Python实现的堆排序算法原理与用法实例分析
- java必须知道的八大种排序算法:冒泡排序、 选择排序、插入排序、快速排序、希尔算法、归并排序算法、基数排序、堆排序算法
- 堆排序算法