//---------------------------------------------------------------------------
#include
<stdio.h>
#include
<stdlib.h>
typedef
struct
{
char
name[80]
float
sc
}
stdinf
int
cmp(const
void
*a,const
void
*b)
{
return
((const
stdinf*)b)->sc-((const
stdinf
*)a)->sc
}
int
main(void)
{
FILE
*fp
stdinf
*sts=NULL
int
i,n
fp=fopen("1.txt","r")
/*打开文件*/码困茄
for
(n
=
0
!feof(fp)
n++)
{
/*读取迟察信息到sts数组尺雀*/
if
(i)
sts=(stdinf*)realloc(sts,sizeof(stdinf)*(n+1))
else
sts=(stdinf*)malloc(sizeof(stdinf))
fscanf(fp,"%s
%f",sts[n].name,&sts[n].sc)
}
fclose(fp)
qsort(sts,i,sizeof(stdinf),cmp)
/*排序*/
fp=fopen("1.txt","w")
/*重新打开文件*/
for
(i
=
0
i<n
i++)
{
/*写入有序信息*/
fprintf(fp,"%s
%f\n",sts[i].name,sts[i].sc)
}
fclose(fp)
return
0
}
//---------------------------------------------------------------------------
#include <stdio.h>#include <stdlib.h>
//假设要打开的文件内容全是整数(如果是橡枣浮点数参照修改)
//数据与数据之间用空格分开
//每行滑判多少数据可以不相同
//数组从小到大排序
void sortit(int *a,int n) {
int i,j,m
for(i=0i<n-1i++)
for(j=i+1j<nj++)
if(a[i]>a[j]){
m=a[i]a[i]=a[j]a[j]=m
}
}
//输出数组元素
void printit(int *a,int n){
int i
for(i=0i<信如改ni++){
printf("%5d",a[i])
if (i%10==9) printf("\n") //设置每10个换行
}
}
//从文件fp中读取n个数据到a
void getdata(FILE *fp,int *a,int n){
int i
fseek(fp,0,0)
for(i=0i<ni++)
fscanf(fp,"%d",&a[i])
}
//获取文件中整数数椐的个数
int getdatabound(FILE *fp){
int i=0,n
fseek(fp,0,0)
while(fscanf(fp,"%d",&n)!=EOF) i++
return i
}
int main(){
int n,*a
char *myfile="d:\\data.txt"
FILE *fp
if ((fp=fopen(myfile,"r"))==NULL){
printf("打开文件%s失败\n",myfile)
return 0
}
n=getdatabound(fp) //获取该文件中有多少整数
printf("该文件共有%d个整数\n",n)
a=(int *)malloc(sizeof(int)*n) //分配n个整数的空间
getdata(fp,a,n) //从文件fp中读取n个数据到a
fclose(fp)
printf("排序前的数组\n")
printit(a,n)//输出数组的值
printf("\n")
sortit(a,n)
printf("排序后的数组\n")
printit(a,n)
printf("\n")
}
采用插入排序,通过排空猜索引加速。C代码:#include <stdio.h>
#define NATION_MAX 256
#define LINE_MAX 1000
#define HEADER_SIZE 256
typedef struct
{
int No
char Nation[NATION_MAX]
int gold, silver, bronze, sum
}Medal
int loadMedal(Medal *medals, char *header, const char *fileName)
{
int n = 0
FILE *fp = fopen(fileName, "r")
if(!fp) return 0
fgets(header, HEADER_SIZE, fp)
while(fscanf(fp, "正亏备%d%s%d%d%d%d", &(medals[n].No), medals[n].Nation,
&(medals[n].gold), &(medals[n].silver), &(medals[n].bronze),
&(medals[n].sum)) == 6){
n ++
if(n >= LINE_MAX) return n
}
fclose(fp)
return n
}
void showMedal(Medal *medals, char *header, int nMedal, int *sorted)
{
int i, index
fputs(header, stdout)
for(i = 0i <nMedali ++) {
index = sorted[i]
printf("举毁%d\t%s\t%d\t%d\t%d\t%d\n", medals[index].No,
medals[index].Nation, medals[index].gold,
medals[index].silver, medals[index].bronze, medals[index].sum)
}
}
void sortByNation(Medal *medals, int nMedal, int *sorted)
{
int i, j
int key
int *a = sorted
int index
for(j = 1j <nMedalj ++){
key = medals[a[j]].Nation[0]
index = a[j]
for(i = j - 1(medals[a[i]].Nation[0] >key) &&(i >= 0)i--){
a[i+1] = a[i]
}
a[i+1] = index
}
}
void sortBySum(Medal *medals, int nMedal, int *sorted)
{
int i, j
int key
int *a = sorted
int index
for(j = 1j <nMedalj ++){
key = medals[a[j]].sum
index = a[j]
for(i = j - 1(medals[a[i]].sum >key) &&(i >= 0)i--){
a[i+1] = a[i]
}
a[i+1] = index
}
}
void resetIndex(int *sorted, int nMedal)
{
int i
if(nMedal >LINE_MAX) return
for(i = 0i <nMedali++){
sorted[i] = i
}
}
int main()
{
Medal medals[LINE_MAX]
int sorted[LINE_MAX]
char header[HEADER_SIZE]
int nMedal
nMedal = loadMedal(medals, header, "medal.txt")
resetIndex(sorted, nMedal)
/* showMedal(medals, header, nMedal, sorted)*/
/* 按国家首字母排序*/
sortByNation(medals, nMedal, sorted)
/* 显示 */
showMedal(medals, header, nMedal, sorted)
/* 按总奖牌数排序 */
sortBySum(medals, nMedal, sorted)
/* 显示 */
showMedal(medals, header, nMedal, sorted)
return 0
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)