c语言实现各种排序算法(作业:点名册排序)

1.堆排序

#include <stdio.h>
struct sheet                                                     //结构体
{
    int number;
    char *name;         
};

void printer(sheet pupil[],int n)                                //打印点名册函数
{
    int k;
    for (k=0;k<n;k++)
    {
        printf("                     学号:%d,姓名:%s\n",pupil[k].number,pupil[k].name);
    }
    printf("\n");
}
void headadjust(sheet pupil[],int i,int j)                        //建堆函数 下标从0开始
{
    sheet temp = pupil[i];
    int k = 2*i+1;
    while (k<=j)
    {
        if (k<j&&pupil[k].number<pupil[k+1].number)
            k++;
        if (temp.number<pupil[k].number)
        {
            pupil[i] = pupil[k];
            i = k;
            k = 2*k+1;
        }
        else break;
    }
    pupil[i] = temp;
}

void headsort(sheet pupil[],int n)                                    // 堆排序算法函数
{
    int f=1;
    for(int i = n/2-1;i>=0;i--)
        headadjust(pupil,i,n-1);
    printf("初始建堆:\n");
    printer(pupil,8);//打印第一次堆建立
    for(i=n-1;i>0;i--)
    {
        sheet temp = pupil[0];
        pupil[0]=pupil[i];
        pupil[i] = temp;
        headadjust(pupil,0,i-1);    
        printf("第%d次调整堆:\n",f);
        f++;
        printer(pupil,8);//打印每次更新堆得内容    
    }
}
    
void main() 
{
    sheet pupil[8] = 
    {
        {120,"马海事"},
        {33,"黄广源"},
        {64,"梁伟"},
        {47,"老炳"},
        {11,"dota"},
        {550,"科比"},
        {310,"林书豪"},
        {16,"詹姆斯"}
    };
    printf("                   初始点名册为:\n");
    printer(pupil,8);
    headsort(pupil,8);
    printf("\n");
    printf("最终排序结果:\n");
    printer(pupil,8);
    getchar();
    getchar();
}
2.快速排序

#include <stdio.h>
#define Max 20
struct sheet
{
    int number;
    char *name;         
};

//快速排序算法
void quicksort(sheet pupil[],int left,int right)
{
    int i,j;
    sheet swap;
    if(left < right)
    {
        i=left;
        j=right;
        swap = pupil[i];
        do 
        {
            while(pupil[j].number>swap.number&&i<j)
                j--;
            if (i<j)
            {
                pupil[i]=pupil[j];
                i++;
                
            }
            while(pupil[i].number<swap.number&&i<j)
                i++;
            if (i<j)
            {
                pupil[j]=pupil[i];
                j--;
            }
        } while (i!=j);
        pupil[i]=swap;
        quicksort(pupil,left,i-1);
        quicksort(pupil,i+1,right);
    }
    
}

//归并排序
void merge(sheet number[],int first,int last,int mid)
{
    sheet number_temp[Max];
    int i=first,j=mid+1,k;
    for(k=0;k<=last-first;k++)
    {
        if (i==mid+1)
        {
            number_temp[k]=number[j++];
            continue;
        }
        if (j==last+1)
        {
            number_temp[k]=number[i++];
            continue;
        }
        if (number[i].number<number[j].number)  
            number_temp[k]=number[i++];
        else  
            number_temp[k]=number[j++];
    }
    for (i=first,j=0;i<=last;i++,j++)
        number[i] = number_temp[j];
}

void merge_sort(sheet number[],int first,int last)
{
    int mid=0;
    if(first<last)
    {
        mid=(first+last)/2;
        merge_sort(number,first,mid);
        merge_sort(number,mid+1,last);
        merge(number,first,last,mid);
    }
}



//折半查找算法
int BinarySearch(sheet pupil[], int length, int key)
{
    int low = 0;
    int high = length - 1;
    while(low<=high)
    {
        int mid = (low+high)/2;
        if (key==pupil[mid].number) return mid;
            else 
                if (key<pupil[mid].number) high=mid -1;
                    else low=mid +1; 
    }
    return -1;
}

3.合并排序

#include <stdio.h>
#include <malloc.h>
#include <iostream>
using namespace std;


struct sheet
{
    int number;
    char *name;         
};
void Merge(sheet rawArray[],int firstIndex,int middleIndex,int lastIndex)
{
    int firstArrayCount = middleIndex - firstIndex + 1;
    int secondArrayCount = lastIndex - middleIndex;
    
    sheet *firstArray = new sheet[firstArrayCount];
    sheet *secondArray = new sheet[secondArrayCount];
    int i=0;
    for ( i = 0; i < firstArrayCount; i++)
    {
        firstArray[i] = rawArray[firstIndex + i];
    }

    for ( i = 0; i < secondArrayCount; i++)
    {
        secondArray[i] = rawArray[middleIndex + i + 1];
    }
    
    int firstArrayIndex = 0;
    int secondArrayIndex = 0;
    int rawArrayIndex = firstIndex;
    while (firstArrayIndex < firstArrayCount && secondArrayIndex < secondArrayCount)
    {
        if (firstArray[firstArrayIndex].number <= secondArray[secondArrayIndex].number)
        {
            rawArray[rawArrayIndex++] = firstArray[firstArrayIndex++];
        }
        else
        {
            rawArray[rawArrayIndex++] = secondArray[secondArrayIndex++];
        }
    }
    while (firstArrayIndex < firstArrayCount)
    {
        rawArray[rawArrayIndex++] = firstArray[firstArrayIndex++];
    }
    
    while (secondArrayIndex < secondArrayCount)
    {
        rawArray[rawArrayIndex++] = secondArray[secondArrayCount++];
    } 
}


void MergeSort(sheet rawArray[],int firstIndex,int lastIndex)
{
    if (firstIndex < lastIndex)
    {
        int middleIndex = (firstIndex + lastIndex)/2; 
        MergeSort(rawArray, firstIndex, middleIndex);
        MergeSort(rawArray, middleIndex + 1, lastIndex);
        Merge(rawArray, firstIndex, middleIndex, lastIndex);
    }
}


void main() 
{
    sheet pupil[5] = 
    {
        {120,"ma"},
        {33,"pang"},
        {64,"weil"},
        {47,"tiantian"},
        {11,"wang"}
    };
    printf("初始点名册为:\n");
    int k;
    for (k=0;k<5;k++)
    {
        printf("学号:%d,姓名:%s\n",pupil[k].number,pupil[k].name);
    }
    MergeSort(pupil,0,4);
    //    quicksort(pupil,0,4);
    printf("排序后的点名册为:\n");
    for (k=0;k<5;k++)
    {
        printf("学号:%d,姓名:%s\n",pupil[k].number,pupil[k].name);
    }
    
    
}        
4.选择和冒泡排序

#include <stdio.h>
struct sheet
{
    int number;
    char *name;         
};



/*
void select_sort(sheet pupil[],int n)                              //这是插入排序
{
    int a;
    sheet swap;
    for (int i=1;i < n;i++)
    {
        for (int k=0;k < i;k++)
        {
            if (pupil[i].number <= pupil[k].number)
            {
                swap = pupil[i];
                a=k;
                while(a<i) 
                {
                    pupil[i]=pupil[i-1];
                    i--;
                }
                pupil[a] = swap;                
                break;
            }
        }
    }
}
*/

void select_sort(sheet pupil[],int n)
{
    int min=0;
    for (int i=0;i < n-1;i++)
    {
        min=i;
        for (int j = i+1;j < n;j++)
        {
            
            if (pupil[j].number < pupil[min].number)
            {
                min =j;
            }
        }
        
        sheet temp;
        temp = pupil[min];
        pupil[min] = pupil[i];
        pupil[i] = temp; 
    //    swap(&pupil[min],&pupil[i]);
    }
}

void bubble_sort(sheet pupil[],int n) 
{
    sheet temp;
    for (int k=n;k>0;k--)
    {
        for (int i=0; i< k ;i++)
        {
            if (pupil[i].number>pupil[i+1].number)
            {
                temp = pupil[i+1];
                pupil[i+1] = pupil[i];
                pupil[i] = temp; 
            }
        }
    }        
}

int find(sheet pupil[],int n,int k) 
{
    for (int i=0;i<n;i++)
    {
        if (pupil[i].number==k)
        {
            return i;
        }
    }
    return -1;
}

5.拓扑排序

#include <iostream>
#include <stdlib.h>

#define MAX_VERTEX_NUM 30   
#define STACK_INIT_SIZE 100  
#define STACKINCREMENT 10   
typedef char InfoType;
typedef char VertexType;
typedef int SElemType;
typedef enum{DG,DN,UDG,UDN}GraphKind;

typedef struct ArcNode{ 
    int adjvex; 
    struct ArcNode *nextarc; 
    InfoType *info; 
}ArcNode;
typedef struct VNode{   
    VertexType data; 
    ArcNode *firstarc; 
}VNode,AdjList[MAX_VERTEX_NUM];
typedef struct ALGraph{ 
    AdjList vertices;
    int vexnum, arcnum; 
    int kind;
}ALGraph;

typedef struct Stack{   
        SElemType *base;   
        SElemType *top;     
        int stacksize;       
}Stack;

int CreateGraph(ALGraph &g);    //建立图的邻接表 
int LocateVex(ALGraph g, char v);   //v在图的邻接表中的位置返回位置i 
int FindInDegree(ALGraph g, int indegree[]);    //查找每个顶点结点的入度 
void TopologicalSort(ALGraph g);                //减一法实现的拓扑排序 
int InitStack(Stack &s);                        //初始化栈 
int Push(Stack &s, SElemType e);                //入栈 
int Pop(Stack &s,SElemType &e);                 //出栈 
int StackEmpty(Stack s);                        //判断是否是空栈 

int main(){
    int i;
    ALGraph g;
    CreateGraph(g);
    TopologicalSort(g); 
    system("pause");
    return 0;
}
/

int CreateGraph(ALGraph &g){
     FILE *fp;
     char fileName[20];
     printf("输入图形数据文件名:\n");
     scanf("%s",fileName);
     if((fp=fopen(fileName,"r+"))==NULL){       //读取文件Graph.txt中存储的图信息 
          printf("无法打开文件\n");
          printf("按任意键退出\n");
          getchar();getchar();
          exit(0);                                    
    }
     
     fscanf(fp,"%d %d",&g.vexnum,&g.arcnum);    //读结点数和弧数 
     int i,j,k;
     char v1,v2,ch1,ch2;
     getchar();
     //printf("%d %d\n",g.vexnum,g.arcnum);
     fgetc(fp);//吃回车 
     for(i=0;i<g.vexnum;i++){
         fscanf(fp,"%c",&g.vertices[i].data);   //建立结点数据 
         fgetc(fp);//吃空格    //getchar();
         g.vertices[i].firstarc = NULL;
     }
     
     for(j=0;j<g.arcnum;j++){       //存储弧信息 
         fscanf(fp,"%c%c%c%c",&v1,&ch1,&ch2,&v2);//getchar();
         fgetc(fp);//吃回车
         //printf("v1=%c,v2=%c\n",v1,v2);
         i = LocateVex(g,v1);
         k = LocateVex(g,v2);
         if(i==-1 || k==-1) {
            if(i==-1) printf("不存在结点%c的值\n",v1);
            if(k==-1) printf("不存在结点%c的值\n",v2);
            system("pause");
            exit(-2);       
         }
        
         ArcNode *p = (ArcNode *)malloc(sizeof(ArcNode)); 
         p->adjvex = k;                 //倒序建立弧链表 
         p->nextarc = g.vertices[i].firstarc;
         g.vertices[i].firstarc = p;
  
     }
 
     return 0;
}



int LocateVex(ALGraph g, char v){   //
     int i;
     for(i=0;i<g.vexnum;i++){
         if(g.vertices[i].data==v) break;
     }
     if(i<g.vexnum) return i;
     return -1;
}

void TopologicalSort(ALGraph g){
        int i,j,indegree[MAX_VERTEX_NUM]={0};
        int count=0;
        ArcNode *w = (ArcNode *)malloc(sizeof(ArcNode));
        FindInDegree(g,indegree);   //查找结点入度,存放到数据indegree中 
        
        //for(int o=0;o<g.vexnum;o++){
        //    printf("%d\n",indegree[o]);    
        //}
        Stack s;
        InitStack(s);
        for(i=0;i<g.vexnum;i++){
             if(indegree[i]==0) {
                    Push(s,i);
             }                        
        }
        //system("pause");
        printf("拓扑排序序列:");
        while(!StackEmpty(s)){
              Pop(s,i);
              printf("%c ",g.vertices[i].data);
              count++;
              for(w=g.vertices[i].firstarc;w;w=w->nextarc){
                   j = w->adjvex;
                   indegree[j]--;
                   if(indegree[j]==0) Push(s,j);
              }                      
        }
        
        printf("\n");
        if(count<g.vexnum) printf("输入的图存在环,拓扑排序无解!\n");
}

int InitStack(Stack &s){
        s.base = (SElemType *)malloc(STACK_INIT_SIZE * sizeof(SElemType));
        if(!s.base) exit(-2); //分配出错,溢出
        s.top = s.base;
        s.stacksize = STACK_INIT_SIZE;
        return 1;
}

int Push(Stack &s, SElemType e){
        if(s.top-s.base >= s.stacksize){
             s.base = (SElemType *)realloc(s.base,(s.stacksize+STACKINCREMENT)*sizeof(SElemType));
             if(!s.base) exit(-2);
             s.top = s.base + s.stacksize;
             s.stacksize += STACKINCREMENT;              
        }
        *s.top = e;
        s.top++;
        return 1;
}

int Pop(Stack &s,SElemType &e){
        if(s.top==s.base) return 0;
        s.top--;
        e = *s.top;
        return 1;
}

int StackEmpty(Stack s){
        if(s.top==s.base) return 1;
        else return 0;
}

int FindInDegree(ALGraph g, int indegree[]){
        int i;
        ArcNode *w = (ArcNode *)malloc(sizeof(ArcNode));
        for(i=0;i<g.vexnum;i++){
              for(w=g.vertices[i].firstarc;w;w=w->nextarc){
                     indegree[w->adjvex]++;                                             
              }                        
        }        
}

graph.txt

6 7
a b c d e f
a->c
b->c
c->d
c->e
d->e
a->f
f->b

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值