【数据结构】各类排序算法的实现

 给出n个学生的考试成绩表,每条信息由姓名和成绩组成,
试运用各种排序思想设计算法并比较其性能,要求实现:
a.按分数高低次序,打印出每个学生在考试中获得的名次,分数相同的为同一名次;
b.按名次列出每个学生的姓名与分数。

#include<stdio.h>
#include<string>
#include<string.h>
#include<iostream>
const int N=1e3+10;
using namespace std;
/*
给出n个学生的考试成绩表,每条信息由姓名和成绩组成,
试运用各种排序思想设计算法并比较其性能,要求实现:
a.按分数高低次序,打印出每个学生在考试中获得的名次,分数相同的为同一名次;
b.按名次列出每个学生的姓名与分数。*/
typedef struct Node{
    double S;
    string name;
    bool operator > (const Node & p)const {
        return S>p.S;
    }
    bool operator < (const Node & p)const {
        return S<p.S;
    }
    bool operator <=(const Node & p)const {
        return S<=p.S;
    }
    bool operator >=(const Node & p)const {
        return S>=p.S;
    }
}Student;
typedef Node Type;
Student a[N];
int n;
/*void swap(Student &a, Student &b){
    Student tmp=a;
    a=b;
    b=tmp;
}*/
void CreateTable(){
    cin>>n;
    for(int i=1;i<=n;i++){
        cin>>a[i].S>>a[i].name;
    }
}
void Output(){
    for(int i=1;i<=n;i++){
        int No=i;
        if(a[i].S==a[i-1].S){
            No--;
        }
        cout<<"第"<<No<<"名 为:";
        cout<<a[i].S<<"   "<<a[i].name<<endl;
    }
}
void InsertSort(){
    for(int i=1;i<=n;i++){
        if(a[i].S>a[i-1].S){
            int k=i-1;
            Student tmp=a[i];
            for(int j=k;j>=1&&tmp>a[j];j--){
                a[j+1]=a[j];
                k--;
            }
            a[k+1]=tmp;
        }
    }
    Output();
}
void BubbleSort(){
    for(int i=1;i<n;i++){
        for(int j=1;j<=n-i;j++){
            Student tmp;
            if(a[j]<a[j+1]){
                swap(a[j],a[j+1]);
                /*tmp=a[j];
                a[j]=a[j+1];
                a[j+1]=tmp;*/
            }
        }
    }
    Output();
}
void QuickSort(int L,int R){
    if(L<R){
        int i=L,j=R;
        Node x=a[L];
        while(i<j){
            while( i<j && a[j]<x ){
                j--;
            }
            if(i<j)
                a[i++]=a[j];
            while(i<j&&a[i]>=x){
                i++;
            }
            if(i<j)
                a[j--]=a[i];
        }
        a[i]=x;
        QuickSort(L,i-1);
        QuickSort(i+1,R);
    }
}
void SelectSort(){
    for(int i=1;i<n;i++){
        int k=i;
        for(int j=k+1;j<=n;j++){
            if(a[k]<a[j]){
                k=j;
                //printf("%f %f \n",a[k].S,a[j].S);
            }
        }
        if(i!=k){
            swap(a[i],a[k]);
        }
    }
    Output();
}
void MergeSort(Type *t,int L, int R){
    int i,j,k;
    int mid;
    if(L>=R){
        return ;
    }
     //*tmp;  //可能指针分配出问题,导致程序无法运行
    //Type *tmp=(Type *)malloc(sizeof(Type)*(R-L+2));
    Type *tmp=new Type[R-L+1];
    if(t==NULL){
        return ;
    }

    if(tmp==NULL){
        return;
    }
    mid=(L+R)/2;
    MergeSort(t,L,mid);
    MergeSort(t,mid+1,R);

    i=L; j=mid+1; k=0;
    while( i<=mid && j<=R ){
        if(t[i]>t[j]){
            tmp[k++]=t[i++];
        }else{
            tmp[k++]=t[j++];
        }
    }
    while(i<=mid){
        tmp[k++]=t[i++];
    }
    while(j<=R){

        tmp[k++]=t[j++];
    }
    for(i=0;i<=R-L;i++){
        t[L+i]=tmp[i];

    }
    delete tmp;
    return;
}
void AdjustDown(Type a[], int i, int n){
    int j=i*2+1;
    while(j<n){
        if(j+1<n&&a[j]>a[j+1]){
            j++;
        }
        if(a[i]<a[j]) break;
        swap(a[i],a[j]);
        i=j;
        j=i*2+1;
    }
}
void MakeHeap(Type *a, int n){
    int i=0;
    for(i=n/2-1;i>=0;i--){
        AdjustDown(a,i,n);
    }
}
void HeapSort(Type a[], int n){
    int i=0;
    MakeHeap(a,n);
    for(i=n-1;i>=0;i--){
        swap(a[i],a[0]);
        AdjustDown(a,0,i);
    }
}

int main()
{
    CreateTable();
    //InsertSort();
    //BubbleSort();
    //QuickSort(1,n);   Output();
    //SelectSort();
    //MergeSort(a,1,n);   Output();
    Student b[N];
    for(int i=0;i<n;i++){
        b[i]=a[i+1];
    }
    HeapSort(b,n);
    for(int i=0;i<n;i++){
        int No=i+1;
        if(b[i].S==b[i-1].S){
            No--;
        }
        cout<<"第"<<No<<"名 为:";
        cout<<b[i].S<<"   "<<b[i].name<<endl;
    }
    return 0;
}
/*
5
10 a
6 b
8 d
7 c
10 e
*/

/*  //调试归并排序
    Student b[N];
    for(int i=0;i<n;i++){
        b[i]=a[i+1];
    }
    MergeSort(b,0,n-1);
    for(int i=0;i<n;i++){
        int No=i+1;
        if(b[i].S==b[i-1].S){
            No--;
        }
        cout<<"第"<<No<<"名 为:";
        cout<<b[i].S<<"   "<<b[i].name<<endl;
    }
*/

 

  • 0
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值