纯小白蓝桥杯备赛笔记--DAY8(必备排序算法)

冒泡排序

在这里插入图片描述

算法思想

  • 每次将最大的一下一下地运到最右边,然后确定这个最大的,接着可以发现该问题变成一个更小的子问题。
  • 具体操作:从左向右扫描,如a[i]>a[i+1],执行swap操作。
  • 代码格式
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+9;
int a[N]; 
int main()
{
    int n;cin>>n;
    for(int i=0;i<n;i++)
    {
        cin>>a[i];
    }
    //i表示当前要确定的位置
    for(int i=n;i>=1;i--)
    {
        for(int j=0;j<i-1;j++) // 修改这里,将范围改为从0到i-1
        {
            if(a[j]>a[j+1])swap(a[j],a[j+1]);
        }
     } 
     //输出
     for(int i=0;i<n;i++)cout<<a[i]<<(i==n?"\n":" "); 
    return 0;
}

  • 时间复杂度为平方级,所以适用于数字比较少的情况。

选择排序

在这里插入图片描述

选择排序的思想

  • 与冒泡排序的区别是每次找出最大的放在最右边。
  • 具体操作:
    计算出最大元素的下标,max_id,执行swap操作swap(a[max_id],a[i])

实现

#include<bits/stdc++.h>
using namespace std;
const int N=1e5+9;
int a[N]; 
int main()
{
    int n;cin>>n;
    for(int i=0;i<n;i++)
    {
        cin>>a[i];
    }
    //i表示当前要确定的位置
    for(int i=n-1;i>=0;i--) 
    {
        int max_id=0; 
        for(int j=0;j<=i;j++) 
        {
            if(a[j]>a[max_id])max_id=j;
        }
        swap(a[max_id],a[i]);
     } 
     //输出
     for(int i=0;i<n;i++)cout<<a[i]<<(i==n-1?"\n":" "); // 修改这里,将条件改为i==n-1
    return 0;
}

例题讲解

  • 上述代码改成从大到小排序:
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+9;
int a[N]; 
int main()
{
    int n;cin>>n;
    for(int i=0;i<n;i++)
    {
        cin>>a[i];
    }
    //i表示当前要确定的位置
    for(int i=0;i<n-1;i++) 
    {
        int max_id=i; 
        for(int j=i+1;j<n;j++) 
        {
            if(a[j]>a[max_id])max_id=j;
        }
        swap(a[i],a[max_id]);
     } 
     //输出
     for(int i=0;i<n;i++)cout<<a[i]<<(i==n-1?"\n":" "); // 修改这里,将条件改为i==n-1
    return 0;
}

插入排序

在这里插入图片描述

思想

  • 将待排序的序列依次插入到已排序的序列之中。

实现

//i表示当前要确定的位置 
for(int i=2;i<=n;++i)
{
	//此时[1,i-1]已经为有序数组
	int val=a[i],j;
	//将val和j比较,如果小于就往后移动,为val腾出位置
	for(j=i;j>1&&val<a[j-1];--j)
	{
		a[j]=a[j-1];
	 } 
	 //此时j为给val腾出的位置
	 a[j]=val; 
 } 

实现解释:

从第一个元素开始,该元素可以认为已经被排序;
取出下一个元素,在已经排序的元素序列中从后向前扫描;
如果该元素(已排序)大于新元素,将该元素移到下一位置;
重复步骤3,直到找到已排序的元素小于或者等于新元素的位置;
将新元素插入到该位置后;
重复步骤2~5。
这段代码中的变量i表示当前要确定的位置,val表示当前要插入的值,j用于在已排序的数组中寻找插入的位置。在每次循环中,都会将val和j-1位置的元素进行比较,如果val小于a[j-1],则将a[j-1]向后移动一位,为val腾出位置。当找到合适的位置后,将val插入到该位置

#include<bits/stdc++.h>
using namespace std;
const int N=100;
int a[N];
int main()
{
	int n;cin>>n;
	for(int i=1;i<=n;++i)cin>>a[i];
	//i表示当前要确定的位置 
for(int i=2;i<=n;++i)
{
	//此时[1,i-1]已经为有序数组
	int val=a[i],j;
	//将val和j比较,如果小于就往后移动,为val腾出位置
	for(j=i;j>1&&val<a[j-1];--j)
	{
		a[j]=a[j-1];
	 } 
	 //此时j为给val腾出的位置
	 a[j]=val; 
 } 
   for(int i=1;i<=n;++i)cout<<a[i]<<" ";
   return 0;

}

归并排序

在这里插入图片描述

思想

  • 将一个数组
  • 实现:将一个数组分成两个子数组,将子数组再向下递归的排序直至元素个数为1。然后将相邻的元素合并起来。
  • 在这里插入图片描述
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+9;
int a[N],b[N];
//归并排序的算法 
void MerageSort(int a[],int l,int r)
{
	//1.递归出口:左右边界相等
	if(l==r)return ;
	//2.取mid 
	int mid=(l+r)/2;
	//3.递归排序:左右两个区间分别排序 
	MerageSort(a,l,mid);
	MerageSort(a,mid+1,r);
	//4.设置指针
	int pl=l;int pr=mid+1;int pb=l;
	//5.两个指针合法,开始循环 
	while(pl<=mid||pr<=r)
	{
		if(pl>mid)
		{
			//左半边已经放完
			b[pb++]=a[pr++]; 
		}
		else if(pr>r)
		{
			//右半边已经放完
			b[pb++]=a[pl++]; 
		}
		else
		{
			//两边都还有元素,取最小值放到b数组中 
			if(a[pl]<a[pr])b[pb++]=a[pl++];
			else b[pb++]=a[pr++];
		}
	 } 
	 //完成后要把b数组复制回去a数组
	 for(int i=l;i<=r;++i)a[i]=b[i]; 
	 
 } 

int main()
{
	int n;cin>>n;
	for(int i=1;i<=n;++i)cin>>a[i];
	MerageSort(a,1,n);
	for(int i=1;i<=n;++i)cout<<a[i]<<(1==n?"\n":" ");
    return 0;
} 

快速排序

在这里插入图片描述

思想

快速排序是一种分治法的排序方法,原理是将一个数组分成两个子数组,其中一个子数组的所有元素都小于另一个子数组的元素,然后递归的对这两个子数组进行排序。
时间复杂度为O(nlogn),且不需要额外的空间。

实现

在这里插入图片描述

void QuickSort(int a[],int l,int r)
{
	if(l<r)
	{
		int mid=Partition(a,l,r);
		QuickSort(a,l,mid-1);
		QuickSort(a,mid+1,r);
	}
 } 
 int Partition(int a[],int l,int r)
 {
 	int pivot=a[r];//设a[r]为基准,这一次partition会将a[r]放到正确的位置上
	int i=l,int j=r;//设置两个下标,分别往中间走
	while(i<j)
	{
		while(i<j&&a[i]<=pivot)i++;//左边的小于基准,不需要交换,继续往中间走
		while(i<j&&a[j]>=pivot)j--;
		if(i<j)swap(a[i],a[j]);
		else swap(a[i],a[r]); 
	  }  
	  return i;
 	
 }

在这里插入图片描述- 完整版宝藏排序:

#include<bits/stdc++.h>
using namespace std;
const int N=1e5+9;
int a[N];
 int Partition(int a[],int l,int r)
 {
 	int pivot=a[r];//设a[r]为基准,这一次partition会将a[r]放到正确的位置上
	int i=l;int j=r;//设置两个下标,分别往中间走
	while(i<j)
	{
		while(i<j&&a[i]<=pivot)i++;//左边的小于基准,不需要交换,继续往中间走
		while(i<j&&a[j]>=pivot)j--;
		if(i<j)swap(a[i],a[j]);
		else swap(a[i],a[r]); 
	  }  
	  return i;
 	
 }
void QuickSort(int a[],int l,int r)
{
	if(l<r)
	{
		int mid=Partition(a,l,r);
		QuickSort(a,l,mid-1);
		QuickSort(a,mid+1,r);
	}
 } 

 int main()
 {
 	ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
 	int n;cin>>n;
 	for(int i=1;i<=n;++i)cin>>a[i];
 	QuickSort(a,1,n);
 	for(int i=1;i<=n;++i)cout<<a[i]<<(i==n?"\n":" ");
 	return 0;
 }

桶排序

思想

分类+分治。
把元素的值域分为若干段,每一段对应一个 桶。

操作

  • 将值域分为若干段,每一段对应一个桶。
  • 每个元素放在对应的桶中。
  • 对每个桶分别排序。
  • 按顺序把每个桶中的元素依次取出,合并成最终答案。

实现

  • 每个桶放一个元素
#include <bits/stdc++.h>
using namespace std;
const int N = 5e5 + 9;
int a[N];
int main()
{
 ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
 int n;
 cin >> n;
 for(int i = 1; i <= n; i ++){
   int x;
   cin >> x;
   a[x]++;
 }
for(int i = 0; i <= n; i++) 
for(int j = 0; j < a[i]; j++) {
  cout << i << ' ';
}
  return 0;
}

  • 每个桶是一段区间
#include <bits/stdc++.h>
using namespace std;
const int N = 1e6+9;
vector<int>a[N];
int main()
{
 ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
 int n;
 cin >> n;
 for(int i = 1; i <= n; i ++){
   int x;
   cin >> x;
   a[x/1000].push_back(x);
 }
for(int i = 0; i <N; i++) //对每一个桶进行排序 
{
	sort(a+1,a+n+1);
}
for(int i=0;i<N;i++)
{
	for(auto item:a[i])
	{
		cout<<item<<" ";
	}
}
cout<<endl;
  return 0;
}

此时的时间复杂度为:每个桶排序的时间复杂度之和。

优势

  • 适用于数据量比较大,但是值域比较小。
  • 一个值 对应一个桶的情况的时间复杂度为O(n),此时很推荐使用桶排序。

例题

在这里插入图片描述

#include<bits/stdc++.h>
using namespace std;
int n,perc;
int bucket[607];
int  main()
{
	cin>>n>>perc;//输入成绩及获奖百分比 
	for(int i=1;i<=n;i++)
	{
		int x,sum=0;
		cin>>x;
		bucket[x]++;//将新成绩放入对应的桶中 
		for(int j=600;j>=0;j--)//从小到大枚举 每一个桶 
		{
			sum+=bucket[j];//统计当前成绩的个数
			if(sum>=max(1,perc*i/100)) 
			{
				cout<<j<<" ";
				break;//如果当前人数大于等于获奖比例,那么此时的分数线就为当前分数 
			}
		 } 
	}
}

未完待续,大家一起加油吧!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/501433.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Mamba: Linear-Time Sequence Modeling with Selective State Spaces(论文笔记)

What can I say? 2024年我还能说什么&#xff1f; Mamba out! 曼巴出来了&#xff01; 原文链接&#xff1a; [2312.00752] Mamba: Linear-Time Sequence Modeling with Selective State Spaces (arxiv.org) 原文笔记&#xff1a; What&#xff1a; Mamba: Linear-Time …

双非本,拿到美团测开实习了——经验分享

前言 最近是春招、暑期实习的高峰期&#xff0c;自己也凭借着持续的准备和一部分运气&#xff0c;较早拿到了美团的测开暑期实习。 以前接到美团的短信&#xff0c;都是外卖送达的通知&#xff0c;没想到自己有一天&#xff0c;也能收到offer录用的通知。虽然是测试开发的岗位…

考研数学|《1800》+《660》精华搭配混合用(经验分享)

肯定不行&#xff0c;考研数学哪有这么容易的&#xff01; 先说说这两本习题册&#xff0c;李永乐老师推出的新版660题&#xff0c;相较于18年前的版本&#xff0c;难度略有降低&#xff0c;更加适合初学者。因此&#xff0c;对于处于基础阶段的学习者来说&#xff0c;新版660…

2、Cocos Creator 下载安装

Cocos Creator 从 v2.3.2 开始接入了全新的 Dashboard 系统&#xff0c;能够同时对多版本引擎和项目进行统一升级和管理&#xff01;Cocos Dashboard 将做为 Creator 各引擎统一的下载器和启动入口&#xff0c;方便升级和管理多个版本的 Creator。还集成了统一的项目管理及创建…

算法之并查集

并查集&#xff08;Union-find Data Structure&#xff09;是一种树型的数据结构。它的特点是由子结点找到父亲结点&#xff0c;用于处理一些不交集&#xff08;Disjoint Sets&#xff09;的合并及查询问题。 Find&#xff1a;确定元素属于哪一个子集。它可以被用来确定两个元…

2024年AI大模型基础设施栈市场地图

2024年大模型(LLM)基础架构的组件和工具,最近看到国外的一篇深度分析,技术负责人可以重点关注:附带图谱: 一、现代LLM基础设施栈定义 根据Menlo Ventures的数据,2023年企业在现代AI基础设施栈上的支出超过11亿美元,成为生成式AI中最大的新市场,为初创企业提供了巨大的…

[OpenCV学习笔记]Qt+OpenCV实现图像灰度反转、对数变换和伽马变换

目录 1、介绍1.1 灰度反转1.2 图像对数变换1.3 图像伽马变换 2、效果图3、代码实现4、源码展示 1、介绍 1.1 灰度反转 灰度反转是一种线性变换&#xff0c;是将某个范围的灰度值映射到另一个范围内&#xff0c;一般是通过灰度的对调&#xff0c;突出想要查看的灰度区间。 S …

基于Springboot旅游网站管理系统设计和实现

基于Springboot旅游网站管理系统设计和实现 博主介绍&#xff1a;多年java开发经验&#xff0c;专注Java开发、定制、远程、文档编写指导等,csdn特邀作者、专注于Java技术领域 作者主页 央顺技术团队 Java毕设项目精品实战案例《1000套》 欢迎点赞 收藏 ⭐留言 文末获取源码联系…

下拉选中搜索angularjs-dropdown-multiselect.js

需要引入angularjs-dropdown-multiselect.js 页面 <div ng-dropdown-multiselect"" options"supplierList_data" selected-model"supplierList_select" events"changSelValue_supplierList" extra-settings"mucommonsetti…

python中pow()函数的使用

在Python中&#xff0c;pow() 函数用于计算指定数字的幂。它的语法如下&#xff1a; pow(x, y) 这个函数返回 x 的 y 次方。相当于 x**y。 pow() 函数也可以接受一个可选的第三个参数&#xff0c;用于指定一个取模值&#xff0c;即计算结果与该模值的余数。其语法如下&#…

ping的基础指令

-t Ping 指定的主机&#xff0c;直到停止。 若要查看统计信息并继续操作&#xff0c;请键入 CtrlBreak&#xff1b; 若要停止&#xff0c;请键入 CtrlC。 -a 将地址解析为主机名。 -n count 要发送的回显请求数。 -l size 发送缓冲…

[已解决]Vue3+Element-plus使用el-dialog对话框无法显示

文章目录 问题发现原因分析解决方法 问题发现 点击按钮&#xff0c;没有想要的弹框 代码如下 修改 el-dialog到body中&#xff0c;还是不能显示 原因分析 使用devtool中vue工具进行查看组件结构 原因在于&#xff0c;在一个局部组件(Detail->ElTabPane->…)中使用…

动态规划相关题目

文章目录 1.动态规划理论基础2.斐波那契数3.爬楼梯4.使用最小花费爬楼梯5.不同路径6.不同路径 II7. 整数拆分8. 不同的二叉搜索树 1.动态规划理论基础 1.1 什么是动态规划? 动态规划&#xff0c;英文&#xff1a;Dynamic Programming&#xff0c;简称DP&#xff0c;如果某一…

c语言中的联合体和枚举

这篇文章总结一下c语言中的联合体和枚举。看看这两个东西到底是什么。大家一起学习。 文章目录 一、联合体1.联合体类型的声明。2.联合体的大小。3.相同成员的结构体和联合体对比4.联合体大小的计算。 二、枚举类型1.枚举类型的声明。2.枚举类型的优点。枚举类型的使用。 一、联…

gitee规范团队 代码提交

1.团队开会规范 使用 插件 &#xff1a; git Commit Message Helper 插件进行代码提交前规范 2.gitee代码仓库断控制&#xff0c;上面只是规范了程序员开发端&#xff1b;但是gitee也要管理控制&#xff1b;正则根据每个公司的不同来进行。

民航电子数据库:CAEMigrator迁移数据库时总是卡死

目录 一、场景二、异常情况三、排查四、应急方案 一、场景 1、对接民航电子数据库 2、将mysql数据库迁移到cae数据库 3、使用CAEMigrator迁移工具进行数据库迁移时&#xff0c;该工具会卡死&#xff08;不清楚是否是部署cae服务的服务器资源导致&#xff09; 二、异常情况 …

iOS - Runloop介绍

文章目录 iOS - Runloop介绍1. 简介1.1 顾名思义1.2. 应用范畴1.3. 如果没有runloop1.4. 如果有了runloop 2. Runloop对象3. Runloop与线程4. 获取Runloop对象4.1 Foundation4.2 Core Foundation4.3 示例 5. Runloop相关的类5.1 Core Foundation中关于RunLoop的5个类5.2 CFRunL…

报错[Vue warn]: $listeners is readonly. $attrs is readonly.怎么解决?

代码也没有逻辑错误&#xff0c;但是报错 [Vue warn]: $listeners is readonly. $attrs is readonly. 情况1&#xff1a;多处声明了new Vue&#xff0c;解决方案&#xff1a;删除一个&#xff0c;用全局变量引用同一个Vue 情况2&#xff1a;import Vue from Vue;第二个Vue首字…

跳跃游戏-java

题目描述: 给你一个非负整数数组 nums &#xff0c;你最初位于数组的 第一个下标 。数组中的每个元素代表你在该位置可以跳跃的最大长度 判断你是否能够到达最后一个下标&#xff0c;如果可以&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 解题思想: …

蓝桥OJ 3500阶乘求和(找规律)

阶乘求和 做这道题两个循环到202320232023肯定会超时间。 但是可以发现算到将近40的阶乘时&#xff0c;后9位的答案就已经可以确定了。 #include<bits/stdc.h> using namespace std; using ll long long; const ll p 1e9; int main() {ll res 0;for (int i 1; i &l…
最新文章