《算法笔记》总结No.3——排序

        基础算法之一,相当重要。在普通的机试中如果没有数据类型和时空限制,基本上选择自己最熟悉的就好。本篇只总结选择排序和插入排序,侧重应用,408中要求的种类更加繁多,此处先不扩展难度~总结最常用的两种排序。

一.选择排序

        选择排序是最简单的排序之一,此处介绍的是简单选择排序:即每次从待排序的序列的序列中选择除最小的元素x,令其与待排序不分的第一个元素y进行交换,这样有序区间每次会扩大一位。完成n趟排序后,所有元素就会是有序的。

        如上图:每次只需要找出最小的,放在乱序的最前面(也可以理解为正序的最后面)即可,函数如下(依旧是vector版本,不喜欢写伪码。。):

void selectSort(vector<int> V)
{
	for(int i=0;i<=V.size()-1;i++)
	{
		int k=i;
		for(int j=i;j<=V.size()-1;j++)
			if(V[j]<V[k])
				k=j;			
		int temp=V[i];
		V[i]=V[k];
		V[k]=temp;				
	}
	for(int i=0;i<=V.size()-1;i++)
		cout<<V[i]<<" ";
} 

主函数进行测试:

	vector<int> X;
	int n=0,x=0; 
	cout<<"请输入要排序的元素个数:";
	cin>>n;
	for(int i=1;i<=n;i++)
	{
		cin>>x;
		X.push_back(x);
	}
	selectSort(X);

结果如下:

二.插入排序 

        此处介绍的依旧是最简单的直接插入排序:假设某个序列A,其1到i-1位有序,i到n位无序,那么在1~i-1之间找到一个位置j,将i插入到j后,1~i有序。需要注意的是,i插入到j后,原来的j~i-1会后移一位至j~i+1。

如上,本质上就是将后面的无序元素依次插入到有序元素中~

函数如下:

void insertSort(vector<int> V)
{
	for(int i=1;i<=V.size()-1;i++)   //第1位直接默认有序,从第2位排序到最后一位~ 
	{
		int temp=V[i],j=i;    //临时保存第i位元素,j则从i往前排序 
		while(j>0&&temp<V[j-1])  //只要temp小于前面的元素,循环就一直往前推进 
		{
			V[j]=V[j-1];  //元素后移 
			j--;	
		} 
		V[j]=temp;  //j位置上将原来的i位插入 
	}
	for(int i=0;i<=V.size()-1;i++)
		cout<<V[i]<<" ";
}

测试如下:

三.综合实践 

如下,将下列学生按照成绩从高到底排序:

  • 张三,001,90分
  • 李四,002,100分
  • 王五,003,70分
  • 赵六,004,60分
  • 老扁,005,80分

算法题中经常有类似的题目,首先要做的是定义结构体并赋值:

struct student{
	int score;
	string name;
	string ID;
}; 
student s1={90,"张三","001"};
student s2={100,"李四","002"};
student s3={70,"王五","003"};
student s4={60,"赵六","004"};
student s5={80,"老扁","005"};

 然后乱序压入到同类型的vector中:

	vector<student> s;
	s.push_back(s1);
	s.push_back(s2);
	s.push_back(s3);
	s.push_back(s4);
	s.push_back(s5);

        接下来即可对student类型的vector进行排序,我们这里采用选择排序,直接改编上面的函数即可:注意上面的形参是int型的vector——用来排序整数。而我们这里要对“student”进行排序,因此要将参数类型改编;至于用于比较的元素,直接用v[i].score将属性点出来即可~

void selectSort(vector<student> V)   //更改类型! 
{
	for(int i=0;i<=V.size()-1;i++)
	{
		int k=i;
		for(int j=i;j<=V.size()-1;j++)    
			if(V[j].score>V[k].score)   //直接用score属性比较;此外,要求是升序,因此大的优先 
				k=j;			
		student temp=V[i];    //交换的临时变量要记得换类型~ 
		V[i]=V[k];
		V[k]=temp;				
	}
	for(int i=0;i<=V.size()-1;i++)
		cout<<V[i].name<<":"<<V[i].score<<endl;
} 

测试,没什么问题:

相关推荐

  1. 排序笔记总结

    2024-07-13 15:34:06       35 阅读
  2. 排序算法部分总结

    2024-07-13 15:34:06       42 阅读
  3. 排序算法总结

    2024-07-13 15:34:06       39 阅读
  4. 排序算法总结

    2024-07-13 15:34:06       40 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-13 15:34:06       67 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-13 15:34:06       71 阅读
  3. 在Django里面运行非项目文件

    2024-07-13 15:34:06       58 阅读
  4. Python语言-面向对象

    2024-07-13 15:34:06       69 阅读

热门阅读

  1. AI工具网站

    2024-07-13 15:34:06       17 阅读
  2. 什么是ipc

    2024-07-13 15:34:06       22 阅读
  3. 红帽虚拟化REST API指导文档

    2024-07-13 15:34:06       22 阅读
  4. 层次分析法:matlab代码实现

    2024-07-13 15:34:06       20 阅读
  5. Tg机器人开发:实现自动化图片审核功能

    2024-07-13 15:34:06       18 阅读
  6. Mojo AI编程语言(三)数据结构:高效数据处理

    2024-07-13 15:34:06       22 阅读
  7. postgresql创建只读权限的用户

    2024-07-13 15:34:06       17 阅读
  8. Oracle数据文件扩容

    2024-07-13 15:34:06       22 阅读
  9. vue3的服务端渲染实战项目(1)共12节

    2024-07-13 15:34:06       23 阅读
  10. ubuntu 24.04 安装telnet服务

    2024-07-13 15:34:06       21 阅读
  11. 【Docker Install SQL Server】

    2024-07-13 15:34:06       18 阅读