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

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

  1. 堆排序算法c语言筛选法,【排序】排序算法之选择排序

    排序算法之选择排序 罗朝辉(http://www.cppblog.com/kesalin) 转载请注明出处 排序是数据处理中经常使用的一种重要运算,在计算机及其应用系统中,花费在排序上的时间在系统运行 ...

  2. 函数c语言桶排算法,C语言基本排序算法之桶式排序实例

    本文实例讲述了C语言基本排序算法之桶式排序.分享给大家供大家参考,具体如下: 桶式排序是对一个有n个整型元素的数组a[n],其中对任意i,0 <= a[i] <= m的特殊排序算法. 可以 ...

  3. C语言排序算法(十种排序代码可跑

    C语言排序算法(十种排序代码可跑) 冒泡排序: 选择排序: 插入排序: 归并排序: 快速排序: 希尔排序: 堆排序: 计数排序: 桶排序: 基数排序: 以上就是所有代码,希望同学们好好学习!!! 冒泡 ...

  4. 【排序算法】选择排序(C语言)

    [排序算法]-- 选择排序 目录 一.选择排序的原理 二.选择排序的代码实现 三.选择排序的优化 1. 优化思路 2. 排序优化后问题 3. 优化代码的实现 四.选择排序的效率 一.选择排序的原理 ​ ...

  5. C/C++排序算法(2)希尔排序

    常见排序算法总结(2)希尔排序 一篇文章,带你搞懂 希尔排序 (注:代码语言的选择不应该限制了我们对算法的理解) 文章附有动图!一看就懂! (1)工作原理 希尔排序,也称递减增量排序算法,是插入排序的 ...

  6. 经典排序算法 - 鸽巢排序Pigeonhole sort

    经典排序算法 - 鸽巢排序Pigeonhole sort 原理类似桶排序,同样需要一个很大的鸽巢[桶排序里管这个叫桶,名字无所谓了] 鸽巢其实就是数组啦,数组的索引位置就表示值,该索引位置的值表示出现 ...

  7. 排序---初级排序算法(选择排序、插入排序和希尔排序)

    写在前面的话: 一枚自学Java和算法的工科妹子. 算法学习书目:算法(第四版) Robert Sedgewick 算法视频教程:Coursera  Algorithms Part1&2 本文 ...

  8. 函数模板案例_利用函数模板封装一个排序的函数,可以对不同数据类型数组进行排序 排序规则从大到小,排序算法为选择排序 分别利用char数组和int数组进行测试

    案例描述: 利用函数模板封装一个排序的函数,可以对不同数据类型数组进行排序 排序规则从大到小,排序算法为选择排序 分别利用char数组和int数组进行测试 #include <iostream& ...

  9. 排序算法之计数排序、基数排序和桶排序

    转自:http://www.cnblogs.com/ttltry-air/archive/2012/08/04/2623302.html 计数排序,基数排序,桶排序等非比较排序算法,平均时间复杂度都是 ...

  10. 排序算法 | 直接选择排序,算法的图解、实现、复杂度和稳定性分析

    排序算法 | 直接选择排序,算法的图解.实现.复杂度和稳定性分析 目录 1.直接选择排序的原理 2.图解直接选择排序 3.算法代码实现 4.算法复杂度分析.稳定性分析 直接选择排序 1.直接选择排序的 ...

最新文章

  1. 方舟生存进化服务器修改代码,方舟生存进化服务器代码怎么使用
  2. Android开发应该了解的Binder原理,专题解析
  3. POJ 2453 贪心应用
  4. 系统架构师学习笔记-数据通信与计算机网络(二)
  5. Android 获取app 地址,获取手机设备信息、app版本信息、ip地址
  6. 关于AAARR模型,还停留在理论却不会用?附实例讲解
  7. 运动目标跟踪(十四)--MIL跟踪
  8. C# 如何将EMF文件转换成PNG文件
  9. 【游戏开发进阶】教你在Windows平台编译tolua runtime的各个平台库(Unity | 热更新 | tolua | 交叉编译)
  10. typroa 思维导图_巧用Markdown和百度脑图
  11. 惠而浦扫地机器人充不进电_惠而浦 扫地狗等扫地机器人清扫效果差
  12. LRUCache简单实现
  13. 鸿蒙系统平板界面,首发预装鸿蒙OS!华为MatePad Pro 2系统界面曝光
  14. 华为鲲鹏HCIA考试-练习09
  15. 比例导引 matlab,单步龙格库塔比例导引弹道计算matlab源程序
  16. 入门Java系列(一)——入门与学习方式
  17. python读取mt4数据_[转载]如何获取MT4完整的历史数据?
  18. 《大数据讲堂》:世平信息首席科学家吕喆谈数据治理的落地措施
  19. 两天学完软件测试工程师所需的MySQL数据库技术
  20. oracle排序空值最后

热门文章

  1. 时空图卷积网络ST-GCN论文完全解读记录
  2. 福建师范大学网络教育学院 计算机应用基础 第三次作业,福建师范大学网络教育学院_《计算机应用基础》第三次作业...
  3. 湘潭大学oracle上机试题,湘潭大学计算机考题2010
  4. STM32+ADS1115使用说明文档
  5. 前端_快速入门Vue.js框架
  6. 非常出色的数字音乐编辑器-Cool Edit Pro提供下载
  7. 09 嵌入式C语言如何实现多级队列缓存(Queue、FIFO)
  8. Enumeration
  9. 机器人简化图画手绘图_机器人简笔画画法图片欣赏
  10. 在基于ZYNQ MPSOC XCZU3CG自定义单板上运行DPU例程