1. 程式人生 > >學生成績排序(直接插入,冒泡,快排,選擇,堆排,2路歸併)

學生成績排序(直接插入,冒泡,快排,選擇,堆排,2路歸併)

內容:

給出n個學生的考試成績表,每條記錄由學號、姓名和分數和名次組成,設計演算法完成下列操作:

(1)設計一個顯示對學生資訊操作的選單函式如下所示:

*************************

       1、錄入學生基本資訊

       2、直接插入排序

       3、氣泡排序

       4、快速排序

       5、簡單選擇排序

       6、堆排序

       7、2-路歸併排序

       8、輸出學生資訊

       0、退出

*************************

請選擇:

演算法設計要求:按分數從高到低的順序進行排序,分數相同的為同一名次。輸入的學生資訊存入檔案中,每選擇一種排序方法,必須從檔案中取出資料。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int n;
typedef struct student{
	char num[20];
	char name[25];
	int score;	
}*Stu,StuNode;

void Build(Stu stu)
{
	FILE *fp;
	char name[20];
	int score,i;
	char num[20];
	fp=fopen("E:\\Student.txt","w");
	printf("請輸入學生人數:");
	scanf("%d",&n);

	printf("請輸入學生資訊(學號,姓名,成績):\n");
	for(i=1;i<=n;i++)
	{
		scanf("%s %s %d",num,name,&score);
		fprintf(fp,"%s %s %d\n",num,name,score);
	}
	printf("登入成功.\n");
	fclose(fp);
}
void ReadFile(Stu &stu)
{//讀檔案,存到Stu結構體中 
	FILE *fp;
	int i;
	stu=(Stu)malloc(sizeof(StuNode)*(n+1));
	fp=fopen("E:\\Student.txt","r");
	for(i=1;i<=n;i++)
		fscanf(fp,"%s %s %d",stu[i].num,stu[i].name,&stu[i].score);

	fclose(fp);
}

void Display(Stu stu)
{//顯示資料 
	int i;
	int temp=1,index=0;
	for(i=1;i<=n;i++)
	{
		printf("%2d %15s %15s %5d\n",temp,stu[i].num,stu[i].name,stu[i].score);
		if(i<n && stu[i].score==stu[i+1].score)
			index++;		
		else
		{
			temp+=index+1;
			index=0;
		}
	}
	
	free(stu);
}

void Swap(StuNode &a,StuNode &b)
{
	StuNode temp;
	temp=a;
	a=b;
	b=temp;
}

void InsertSort(Stu stu)
{//直接插入排序
	int i,j;
	int key;
	char name[20];
	char num[20];
	StuNode temp;
	stu=(Stu)malloc(sizeof(StuNode)*(n+1));
	ReadFile(stu);
	
	for(i=n;i>=1;i--)
	{
		temp=stu[i];
		j=i-1;
		while(j>=1 && temp.score> stu[j].score)
		{
			stu[j+1]=stu[j];
			j--;
		}
		j+=1;
		stu[j]=temp;
	}
	Display(stu);
}

void BubbleSort(Stu stu)
{//氣泡排序 
	int i,j,peace;
	stu=(Stu)malloc(sizeof(StuNode)*(n+1));
	ReadFile(stu);
	peace=1;
	for(i=1;i<=n-1 && peace;i++)
	{
		peace=0;
		for(j=1;j<=n-j;j++)
		{
			if(stu[j].score < stu[j+1].score)
			{
				Swap(stu[j],stu[j+1]);
				peace=1;
			}
		}
	}
	Display(stu);
}
int Partition(Stu stu,int low,int high)
{//快速排序--排序 
	int Pi;
	stu[0]=stu[low];
	
	Pi=stu[0].score;
	while(low<high)
	{
		while(low<high && stu[high].score<=Pi)
			high--;
		stu[low]=stu[high];
		while(low<high && stu[low].score>=Pi)
			low++;
		stu[high]=stu[low];
	}
	stu[low]=stu[0];
	return low;
}
void QuickSort(Stu stu,int low,int high)
{//快速排序--二分 
	int Pi;
	if(low<high)
	{
		Pi=Partition(stu,low,high);
		QuickSort(stu,low,Pi-1);
		QuickSort(stu,Pi+1,high);
	}
}
void SeletionSort(Stu stu)
{//選擇排序 
	int i,j,temp;
	stu=(Stu)malloc(sizeof(StuNode)*(n+1));
	ReadFile(stu);
	for(i=1;i<=n-1;i++)
	{
		int key=stu[i].score;
		for(j=i+1;j<=n;j++)
		{
			if(key<stu[j].score)
			{
				temp=j;
				key=stu[j].score;
			}
		}
		if(i!=j)
			Swap(stu[i],stu[temp]);
	}
	Display(stu);
}
void HeapAdjust(Stu stu,int s,int m)
{//調整堆 
	int j;
	StuNode rc;
	rc=stu[s];
	
	for(j=2*s;j<=m;j*=2)
	{
		if(j<m && stu[j].score>stu[j+1].score)
			j++;
		if(!(rc.score>stu[j].score))
			break;
		stu[s]=stu[j];
			s=j;
	}
	stu[s]=rc;
}
void HeapSort(Stu stu)
{//堆排序 
	int i;
	ReadFile(stu);
	for(i=n/2;i>0;i--)
		HeapAdjust(stu,i,n);
	for(i=n;i>1;i--)
	{
		Swap(stu[1],stu[i]);
		HeapAdjust(stu,1,i-1);
	}
	Display(stu);
}

void Merge(Stu stu,int low,int mid,int high)
{//歸併排序--歸併 
	if(low>=high)
		return ;
	int i,j,k;
	StuNode temp[1005];
	i=low;j=mid+1;k=0;
	while(i<=mid && j<=high)
	{
		if(stu[i].score>stu[j].score)
			temp[k++]=stu[i++];
		else
			temp[k++]=stu[j++];
	}
	while(i<=mid)
		temp[k++]=stu[i++];
	while(j<=high)
		temp[k++]=stu[j++];
	for(i=low;i<=high;i++)
	{
		stu[i]=temp[i-low];
		printf("%d ",stu[i].score);
	}
	putchar('\n');
	
}

void MergeSort(Stu stu,int low,int high)
{//歸併排序--二分 
	if(low>=high)
		return ;
	int mid=(low+high)/2;
	MergeSort(stu,low,mid);
	MergeSort(stu,mid+1,high);
	Merge(stu,low,mid,high);
}

int main()
{
	Stu stu;
	int key;
	while(1)
	{
		printf("	----------------------\n");
		printf("	1.錄入學生基本資訊。\n");
		printf("	2.直接插入排序。\n");
		printf("	3.氣泡排序。\n");
		printf("	4.快速排序。\n"); 
		printf("	5.簡單選擇排序。\n");
		printf("	6.堆排序。\n");
		printf("	7.2-路歸併排序。\n");
		printf("	8.輸出學生資訊。\n");
		printf("	9.退出。\n");
		printf("	----------------------\n");
		scanf("%d",&key);
				
		switch(key)
		{
			case 1:
				Build(stu);
				break;
			case 2:
				InsertSort(stu);
				break;
			case 3:
				BubbleSort(stu);
				break;
			case 4:
				ReadFile(stu);
				QuickSort(stu,1,n);
				Display(stu);
				break;
			case 5:
				SeletionSort(stu);
				break;
			case 6:
				HeapSort(stu);
				break;
			case 7:
				ReadFile(stu);
				MergeSort(stu,1,n);
				Display(stu);
				break;
			case 8:
				ReadFile(stu);
				Display(stu);
				break;
			default:
				return 0;
		}
	}
}