#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <string.h>
#include <windows.h>
#define MAX 16
typedef struct
{
long stu_no;
char name[10];
int score;
}rectype;
int n=0;
void main()
{
void read_file(rectype R[]);
void print_data(rectype R[]);
void ShellSort(rectype R[]);
void QuickSort(rectype R[],int low,int high);
void HeapSort(rectype R[]);
void menu(rectype R[]);
rectype R[MAX];
read_file(R);
menu(R);
//print_data(R);
}
void read_file(rectype R[])
{
FILE *fp1;
int i;
fp1=fopen(".\\data.txt","r");
printf("Please input select numbers(n<=15):");
scanf("%d",&n);
//fscanf(fp1,"%ld,%s,%d");
for(i=1;i<=n;i++)
{
fscanf(fp1,"%ld %s %d",&R[i].stu_no,R[i].name,&R[i].score);
}
fclose(fp1);
}
void print_data(rectype R[])
{
int i;
//printf("\nSorted datas is:\n");
printf(" 学号 姓名 成绩\n");
for(i=1;i<=n;i++)
{
printf("%-12ld%5s%5d\n",R[i].stu_no,R[i].name,R[i].score);
}
printf("\n");
}
void write_file(rectype R[],char file[])
{
int i;
FILE *fp2;
if( (fp2=fopen(file,"w")) == NULL)
{
fprintf(stderr,"文件new.txt关闭失败!\n");
exit(1);
}
for(i=1;i<n;i++)
{
fprintf(fp2,"%ld,%s,%d\n",R[i].stu_no,R[i].name,R[i].score);
}
fclose(fp2);
}
void ShellSort(rectype R[])
{
int gap=n/2;
int i,j;
while(gap!=0)
{
for(i=gap+1;i<=n;i++)
{
if(R[i].stu_no<R[i-gap].stu_no)
{
R[0]=R[i];
for(j=i-gap;(R[0].stu_no<R[j].stu_no)&&(j>0);j=j-gap)
{
R[j+gap]=R[j];
}
R[j+gap]=R[0];
}
}
gap/=2;
}
}
int PARTITION(rectype R[],int low,int high)
{
int i,j;
i = low;
j = high;
R[0]=R[low];
do
{
while((i<j)&&(strcmp(R[j].name,R[0].name)>0))
j--;
R[i]=R[j];
while((i<j)&&(strcmp(R[i].name,R[0].name)<0))
i++;
R[j]=R[i];
}while(i!=j);
R[i]=R[0];
return i;
}
void QuickSort(rectype R[],int low,int high)
{
int i;
if(low<high)
{
i=PARTITION(R,low,high);
QuickSort(R,low,i-1);
QuickSort(R,i+1,high);
}
}
void SIFT(rectype R[],int i,int m)
{
int j;
j=2*i;
while(j<=m)
{
if(j<m && (R[j].score<R[j+1].score))
j=j+1;
if(R[j].score>R[i].score)
{
R[0]=R[j];
R[j]=R[i];
R[i]=R[0];
i=j;
j=2*i;
}
else
break;
}
}
void HEAPCREAT(rectype R[])
{
int i;
for(i=n/2;i>=1;i--)
{
SIFT(R,i,n);
}
}
void HeapSort(rectype R[])
{
int i;
HEAPCREAT(R);
for(i=n;i>=2;i--)
{
R[0]=R[1];
R[1]=R[i];
R[i]=R[0];
SIFT(R,1,i-1);
}
}
void gotoxy(int x,int y)
{
COORD Pos;
HANDLE hCon;
hCon = GetStdHandle(STD_OUTPUT_HANDLE);
Pos.X = x;
Pos.Y = y;
SetConsoleCursorPosition(hCon,Pos);
}
void menu(rectype R[])
{
int n;
//System("cls");
do
{
system("cls");
gotoxy(30,3);
printf("1.用希尔排序算法对学号排序");
gotoxy(30,5);
printf("2.用快速排序算法对姓名排序");
gotoxy(30,7);
printf("3.用堆排序算法对成绩排序");
gotoxy(30,9);
printf("4.退出");
printf("\n");
printf("请输入您的选择:\n");
scanf("%d",&n);
getchar();
switch(n)
{
case 1:
print_data(R);
ShellSort(R);
write_file(R,".//after_shellsort.txt");
printf("希尔排序算法对学号排序后:\n");
print_data(R);
getchar();
break;
case 2:
print_data(R);
QuickSort(R,1,n);
write_file(R,".//after_quicksort.txt");
printf("快速排序算法对姓名排序后:\n");
print_data(R);
getchar();
break;
case 3:
print_data(R);
HeapSort(R);
write_file(R,".//after_heapsort.txt");
printf("堆排序算法对成绩排序后:\n");
print_data(R);
getchar();
break;
case 4:
//cls();
printf("bye-bye");
getchar();
exit(1);
default:
printf("again!");
}
}while(n!=0);
}