排序算法应用

内容:

给出n个学生的考试成绩表,每条记录由学号、姓名和分数和名次组成,设计算法完成下列操作:

设计一个显示对学生信息操作的菜单函数如下所示:

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

1、录入学生基本信息

2、直接插入排序

3、冒泡排序

4、快速排序

5、简单选择排序

6、堆排序

7、2-路归并排序

8、输出学生信息

0、退出

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

算法设计要求:按分数从高到低的顺序进行排序,分数相同的为同一名次。输入的学生信息存入文件中,每选择一种排序方法,必须从文件中取出数据。

#include<stdio.h>
#include<stdlib.h>
#define Max 100

typedef struct Student{
    char name[100];
    int score,number,n;
}Node;
typedef struct{
    Node stu[Max+1];
    int num;
}SqList;
Student stu[Max];

int Creat(SqList &L)
{//创建学生信息并写入文件中
    int i;
    FILE *pWrite;
    pWrite=fopen("stu_scores.txt","w");
    printf("请输入学生人数:\n");
    scanf("%d",&L.num);
    for(i=1;i<=L.num;i++)
    {
        printf("请输入第%d个学生的学号姓名和成绩:\n",i);
        scanf("%d%s%d",&L.stu[i].number,L.stu[i].name,&L.stu[i].score);
        fprintf(pWrite,"%d %s %d\n",L.stu[i].number,L.stu[i].name,L.stu[i].score);
    }
    fclose(pWrite);
    return 0;
}

void place(SqList &L)
{//排名次
    int i,j;
    j=1;
    L.stu[1].n=1;
    for(i=2;i<=L.num;i++,j++)
    {
        if(L.stu[i].score==L.stu[i-1].score)
        {
            L.stu[i].n=j;
        }
        else
            L.stu[i].n=j+1;
    }
}

void Display1(SqList &L)
{//输出学生信息
    int i;
    printf("   学号      姓名    成绩  \n");
    for(i=1;i<=L.num;i++)
    {
        printf("    %d  %8s  %6d\n",L.stu[i].number,L.stu[i].name,L.stu[i].score);
    }
}

void Display2(SqList L)
{//排序后的结果
    int i;
    printf("   学号      姓名    成绩   名次\n");
    for(i=1;i<=L.num;i++)
    {
        printf("    %d  %8s  %6d  %3d\n",L.stu[i].number,L.stu[i].name,L.stu[i].score,L.stu[i].n);
    }
}
void InsertSort(SqList &L)
{//直接插入排序
    int i,j;
    FILE *pRead;
    pRead=fopen("stu_scores.txt","r");
    for(i=1;i<=L.num;i++)
    {
        fscanf(pRead,"%d%s%d",&L.stu[i].number,L.stu[i].name,&L.stu[i].score); //从文件中读取数据
    }
    for(i=2;i<=L.num;++i)
        if(L.stu[i].score>L.stu[i-1].score)
        {
            L.stu[0]=L.stu[i];
            L.stu[i]=L.stu[i-1];
            for(j=i-2;L.stu[0].score>L.stu[j].score;--j)
                L.stu[j+1]=L.stu[j];
                L.stu[j+1]=L.stu[0];
        }
        place(L);
        Display2(L);
}

void BubbleSort(SqList &L)
{//冒泡排序
    Student temp;
    int i,j;
    int flag=1;
    FILE *pRead;
    pRead=fopen("stu_scores.txt","r");
    for(i=1;i<=L.num;i++)
    {
        fscanf(pRead,"%d%s%d",&L.stu[i].number,L.stu[i].name,&L.stu[i].score);
    }
    for(j=1;j<=L.num && flag;j++)
    {
        flag=0;
        for(i=1;i<=L.num-j;i++)
        if(L.stu[i].score<L.stu[i+1].score)
        {
            temp=L.stu[i];
            L.stu[i]=L.stu[i+1];
            L.stu[i+1]=temp;
            flag=1;
        }
    }
    place(L);
    Display2(L);
}

int Partition(SqList &L,int low,int high)
{//枢轴函数
    int pivotkey;
    L.stu[0]=L.stu[low];
    pivotkey=L.stu[low].score;
    while(low<high)
    {
        while(low<high && L.stu[high].score<=pivotkey)
            --high;
        L.stu[low]=L.stu[high];
        while(low<high && L.stu[low].score>=pivotkey)
            ++low;
        L.stu[high]=L.stu[low];
    }
    L.stu[low]=L.stu[0];
    return low;
}

void QSort(SqList &L,int low,int high)
{//对顺序表L中的子序列快速排序
    int pivotloc;
    if(low<high)
    {
        pivotloc=Partition(L,low,high);
        QSort(L,low,pivotloc-1);
        QSort(L,pivotloc+1,high);
    }
}

void QuickSort(SqList &L)
{//对顺序表L快速排序
    int i;
    FILE *pRead;
    pRead=fopen("stu_scores.txt","r");
    for(i=1;i<=L.num;i++)
    {
        fscanf(pRead,"%d%s%d",&L.stu[i].number,L.stu[i].name,&L.stu[i].score);
    }
    QSort(L,1,L.num);
    place(L);
    Display2(L);
}

void SelectSort(SqList &L)
{//简单选择排序
    int  i,j,k;
    Student temp;
    FILE *pRead;
    pRead=fopen("stu_scores.txt","r");
    for(i=1;i<=L.num;i++)
    {
        fscanf(pRead,"%d%s%d",&L.stu[i].number,L.stu[i].name,&L.stu[i].score);
    }
    for(i=1;i<=L.num;i++ )
    {
        k=i;
        for(j=i+1;j<=L.num;j++)
        if(L.stu[k].score<L.stu[j].score)
            k=j;
        if(k!=i)
        {
            temp=L.stu[i];
            L.stu[i]=L.stu[k];
            L.stu[k]=temp;
        }
    }
	place(L);
    Display2(L);
}

void HeapAdjust(SqList &L,int s,int m)
{//调整为大堆
    int i;
    Student r;
    r=L.stu[s];
    for(i=2*s;i<=m;i*=2)
    {
        if(i<m && L.stu[i].score>L.stu[i+1].score)
            ++i;
        if(!(r.score>L.stu[i].score))
            break;
        L.stu[s]=L.stu[i];
        s=i;
    }
    L.stu[s]=r;
}
void HeapSort(SqList &L)
{//堆排序
    int i;
    Student temp;
    FILE *pRead;
    pRead=fopen("stu_scores.txt","r");
    for(i=1;i<=L.num;i++)
    {
        fscanf(pRead,"%d%s%d",&L.stu[i].number,L.stu[i].name,&L.stu[i].score);
    }
    for(i=L.num/2;i>0;--i)
        HeapAdjust(L,i,L.num);
    for(i=L.num;i>1;--i)
    {
        temp=L.stu[1];
        L.stu[1]=L.stu[i];
        L.stu[i]=temp;
        HeapAdjust(L,1,i-1);
    }
    place(L);
    Display2(L);
}

int main()
{
    SqList L;
    int i;
    while(1)
    {
        printf("*****************************\n");
        printf("    1、录入学生基本信息\n");
        printf("    2、直接插入排序\n");
        printf("    3、冒泡排序\n");
        printf("    4、快速排序\n");
        printf("    5、简单选择排序\n");
        printf("    6、堆排序\n");
        printf("    7、输出学生信息\n");
        printf("    0、退出\n");
        printf("****************************\n");
        printf("----请选择操作:-----\n");
        scanf("%d",&i);
        switch(i)
        {
            case 1: Creat(L);
            break;
            case 2: InsertSort(L);
            break;
            case 3: BubbleSort(L);
            break;
            case 4: QuickSort(L);
            break;
            case 5: SelectSort(L);
            break;
            case 6: HeapSort(L);
            break;
            case 7: Display1(L);
            break;
            case 0: return 0;
            break;
        }
    }
}
    原文作者:排序算法
    原文地址: https://blog.csdn.net/HLK_1135/article/details/50287467
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞