目录

  • 实验目的
  • 实验题目
  • 排序模板
  • 实验源代码
  • 实验结果

实验目的

了解各种内部排序方法,掌握Shell排序、快速排序、堆排序,归并排序的排序方法,并将其运用到实际问题中。

实验题目

设计一个排序和查找系统。能够实现对给定的一组学生的借书证信息(如:卡号、姓名、系别、班号等)进行排序和查找。

排序模板

1.快速排序

void quick_sort(Node q[], int l, int r)
{if (l >= r) return;int i = l - 1, j = r + 1, x = q[(l + r) / 2].idCard;while (i < j){do i++; while (q[i].idCard < x);do j--; while (q[j].idCard > x);if (i < j){swap(q[i], q[j]);}}quick_sort(q, l, j); quick_sort(q, j + 1, r);
}

2.归并排序

void merge_sort(Node q[],int l,int r)
{if(l>=r)  return;int mid=l+r>>1;merge_sort(q,l,mid);merge_sort(q,mid+1,r);int k=l,i=l,j=mid+1;while(i<=mid&&j<=r){if(q[i].classId<q[j].classId)  tmp[k++]=q[i++];else   tmp[k++]=q[j++];}while(i<=mid)  tmp[k++]=q[i++];while(j<=r)    tmp[k++]=q[j++];for(int i=l;i<=r;i++)  q[i]=tmp[i];
}

3.希尔排序

void ShellSort(Node A[],int n)
{//前后记录位置的增量 dk//增量dk 并逐步减小增量for(int dk=n/2;dk>0;dk/=2){//从第dk个元素,逐个对其所在组进行直接插入排序操作for(int i=dk;i<n;++i){int j=i;while(j-dk>=0&&A[j].series<A[j-dk].series){//插入排序交换法swap(A[j],A[j-dk]);j-=dk;}}}
}

4.堆排序

void adjust_heap(vector<int>& nums,int x,int n){int l=x*2+1;int r=x*2+2;int max=x;if(l<n&&nums[l]>nums[max])max=l;if(r<n&&nums[r]>nums[max])max=r;if(max!=x){swap(nums[max],nums[x]);adjust_heap(nums,max,n);}}void heap_sort(vector<int>& nums){int n=nums.size();for(int i=n/2-1;i>=0;i--){adjust_heap(nums,i,n);}for(int i=n-1;i>=0;i--){swap(nums[i],nums[0]);adjust_heap(nums,0,i);}}

实验源代码

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<string>
#include<cmath>
using namespace std;
const int N = 10000 + 10;
int n;  //学生数量
struct Node
{int idCard;    //卡号string name;   //姓名int classId;   //班号int series;    //系别
}students[N];
Node tmp[N];
void quick_sort(Node q[], int l, int r)  //使用快速排序,按照卡号从小到大排序
{if (l >= r) return;int i = l - 1, j = r + 1, x = q[(l + r) / 2].idCard;while (i < j){do i++; while (q[i].idCard < x);do j--; while (q[j].idCard > x);if (i < j){swap(q[i], q[j]);}}quick_sort(q, l, j); quick_sort(q, j + 1, r);
}
void merge_sort(Node q[],int l,int r)    //使用归并排序,按照班号从小到大排序
{if(l>=r)  return;int mid=l+r>>1;merge_sort(q,l,mid);merge_sort(q,mid+1,r);int k=l,i=l,j=mid+1;while(i<=mid&&j<=r){if(q[i].classId<q[j].classId)  tmp[k++]=q[i++];else   tmp[k++]=q[j++];}while(i<=mid)  tmp[k++]=q[i++];while(j<=r)    tmp[k++]=q[j++];for(int i=l;i<=r;i++)  q[i]=tmp[i];
}
void ShellSort(Node A[],int n)        //使用希尔排序,按照系别从小到大排序
{//前后记录位置的增量 dk//增量dk 并逐步减小增量for(int dk=n/2;dk>0;dk/=2){//从第dk个元素,逐个对其所在组进行直接插入排序操作for(int i=dk;i<n;++i){int j=i;while(j-dk>=0&&A[j].series<A[j-dk].series){//插入排序交换法swap(A[j],A[j-dk]);j-=dk;}}}
}
void find_name(string name1)  //根据姓名查找一个学生的信息
{int flag=0;for(int i=0;i<n;i++){if(students[i].name==name1){cout<<"姓名: "<<students[i].name<<endl;cout<<"卡号: "<<students[i].idCard<<endl;cout<<"班号: "<<students[i].classId<<endl;cout<<"系别: "<<students[i].series<<endl;flag=1;break; }}if(flag==0) cout<<"没有该学生的信息 !!!"<<endl;
}
int main()
{printf("实验题目\n");printf("设计一个排序和查找系统。能够实现对给定的一组学生的借书证信息\n");printf("(如:卡号、姓名、系别、班号等)进行排序和查找。\n"); printf("\n");printf("--------请输入学生的卡号,姓名,班号,系别-------\n");cin >> n;for (int i = 0; i < n; i++){cin>>students[i].idCard>>students[i].name>>students[i].classId>>students[i].series;}printf("--------使用归并排序对卡号从小到大排序--------\n");quick_sort(students, 0, n-1);for (int i = 0; i < n; i++){cout << students[i].idCard << ' ' << students[i].name << ' ' << students[i].classId << ' ' << students[i].series << endl;}printf("--------使用快速排序对班号从小到大排序--------\n");merge_sort(students,0,n-1);for (int i = 0; i <n; i++){cout << students[i].idCard << ' ' << students[i].name << ' ' << students[i].classId << ' ' << students[i].series << endl;}ShellSort(students,n); printf("--------使用希尔排序对系别从小到大排序--------\n");for (int i = 0; i < n; i++){cout << students[i].idCard << ' ' << students[i].name << ' ' << students[i].classId << ' ' << students[i].series << endl;}printf("请输入要查找的学生的姓名:\n");string str;while(cin>>str) {find_name(str);}return 0;
}
/*
4
688410003 lisi 190142 7
668410002 zhangsan 190143 6
668410001 wangwu 190141  5
668410004 zhangwei 190144 4
*/

实验结果

设计一个排序和查找系统。能够实现对给定的一组学生的借书证信息(如:卡号、姓名、系别、班号等)进行排序和查找。相关推荐

  1. 【面试题】如何设计一个高并发的系统?

    每个行业都一样,人才都是分层次的,从事技术行业的程序员们更是如此,按照技术能力分为三六九等. 每个层次的人出去面试,面试官考察的方向是不一样的. 刚入职场的小白,会问你很多基础性的知识,有过几年经验的 ...

  2. 设计一个分步式登录系统_分布式系统:何时构建它们以及如何扩展。 分步指南。

    设计一个分步式登录系统 It always strikes me how many junior developers are suffering from impostor syndrome whe ...

  3. 如何设计一个复杂的业务系统?从对领域设计、云原生、微服务、中台的理解开始...

    欢迎关注方志朋的博客,回复"666"获面试宝典 01 如何解决复杂业务设计 Aliware 软件架构设计本身就是一个复杂的事情,但其实业界已有一个共识,那就是"通过组件化 ...

  4. 如何设计一个短URL地址系统

    一.短URL系统的原理: 短URL系统的核心是将长的 URL 转化成短的 URL:在访问系统时,先使用短地址A访问短URL系统,由短URL系统映射到对应的长地址B,然后客户端再重定向(301或者302 ...

  5. 设计一个智能客服系统

    背景: 最近在设计一个公司的智能客服系统,通过对现有人工客服语料作为样本,通过训练样本完成整个QA过程或业务办理过程. 整体思路 AliceBot负责闲聊,这里用了开源的语料,也可以添加语料到DB,基 ...

  6. 如何设计一个高性能的秒杀系统

    秒杀系统要如何架构,在做技术方案时要注意哪些问题,搞了个秒杀专辑,专门收集秒杀系列文章. 当你去一家公司面试时,很多面试官都会问你如何设计一个高性能秒杀系统.秒杀涉及的技术域从客户端.浏览器.网络.负 ...

  7. 设计一个安全的排队系统的思考

    文章目录 1.首先需要考虑高可用(HA)问题. 2.需要考虑的是负载能力. 3.需要考虑的是响应速度和流通量. 4.需要考虑的是健壮度,或者说抵抗黑客的攻击性. 在游戏中设计一个优秀而且稳定的排队系统 ...

  8. 设计一个小学生计算机辅助教学系统,c语言实验报告 小学生计算机辅助教学系统...

    c语言实验报告 小学生计算机辅助教学系统 (11页) 本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦! 14.90 积分 实验名称小学生计算机辅助教学系统学校学 ...

  9. 如何设计一个优秀的秒杀系统?

    前言 如果问起秒杀系统如何设计,相信都能说出个123来,但是如果细究其中的细节点,很多人估计就无法很快的打上来了.本文从六个方面,来简要讲一下秒杀系统要如何设计,应该主要哪些事情. 01 | 设计秒杀 ...

最新文章

  1. json对象和json字符串转换方法
  2. 美团真的让人无语!背调了一个多星期,跟我说背调不通过!问原因,HR说没办法透露,但可以看其它美团机会...
  3. 训练、标注成本节省90%!华为云自动化AI开发平台ModelArts 3.0发布,从训练数据到模型落地一站式打通...
  4. Failed to get convolution algorithm.This is probably because cuDNN failed to initialize
  5. Spring源码深度解析第2天
  6. python 类和对象 经常用吗_python基础教程之对象和类的实际运用
  7. 从遇见到信任 | Apache Dubbo 的毕业之旅
  8. 一个银行客户经理的“变形记”
  9. 又是一个秋天~~~~
  10. DevOps工程师到底做些什么?
  11. 面试阿里前端P6血和泪换来的收获
  12. Servlet面试题汇总
  13. 小书童开源免费的二维码批量生成工具
  14. 【音频处理】Melodyne 音高调整 ( 打开音频文件 | 选择音高编辑工具 | 样本音高信息 | 音高自动调整 )
  15. 微信公众号的开发和使用注意事项有哪些?
  16. 2022电大国家开放大学网上形考任务-客户关系管理非免费(非答案)
  17. 易客多快排系统部署教程
  18. 计算机网络中 数据交换的方式有,计算机网络中的通信数据交换技术探讨
  19. C#读取excel文件时,报“外部表不是预期的格式”
  20. SpringSession实战项目(基于SpringBoot项目)【附源码】

热门文章

  1. 如何画出漂亮的深度学习模型图?
  2. 致远OA wpsAssistServlet 任意文件上传漏洞 漏洞复现
  3. 中国易切削钢行业发展趋势及投资前景分析报告(2021-2026年)
  4. 算法设计与分析: 4-3 磁带最优存储问题
  5. C#用firefox3.6下载yunfile的文件
  6. 每天干的啥?(2019.6)
  7. 购物车案例模块(全选,增减商品数量,修改商品小计,计算总计和面额,删除商品,选中商品添加背景)
  8. android 里面的颜色的RGB
  9. php语言讲座,学习PHP语言的十大诀窍
  10. 阿里云装mysql选择版本_mysql学习之-三种安装方式与版本介绍