首页 > 编程语言 >编程奇境:C++之旅,从新手村到ACM/OI算法竞赛大门(武器:排序算法)

编程奇境:C++之旅,从新手村到ACM/OI算法竞赛大门(武器:排序算法)

时间:2024-06-03 20:01:09浏览次数:26  
标签:arr 新手村 洛谷 int luogu 算法 奇境 排序 com

引言

现在你已经拥有了c++的基础语法知识,人物已经有了基本属性,那么想要打怪,手里必须要有趁手的武器,各种算法就是手中的武器,要根据怪物的不同特性来选择不同的武器。本章节讲的就是新手第一把武器:排序算法。

所谓排序算法就是把一些乱序的序列按照从小到大或从大到小进行排序,是竞赛和生活中非常常见的一种算法。

一般有八大排序算法:

  1. 直接插入排序
  2. 希尔排序
  3. 简单选择排序
  4. 堆排序
  5. 冒泡排序
  6. 快速排序
  7. 归并排序
  8. 桶排序/基数排序

但是为了方便新人们入门,我们只先讲最常见的冒泡排序。

学习和掌握这些排序算法,不仅仅是记忆代码那么简单,更重要的是理解它们背后的逻辑和思想。这将帮助你在未来的编程之旅中,面对更加复杂的怪物和难题时,能够迅速挑选出最适合当前场景的“武器”,以智慧和策略,一步步揭开数据世界的奥秘,成为真正的编程高手。

冒泡排序

时间复杂度:O(n^2)

冒泡排序,想象一下你手上有一串彩色的气泡,它们代表着一组数字,但是这些气泡乱了顺序,你需要让它们按照大小整齐排列。怎么办呢?你开始轻轻地吹每一个气泡,让相邻的两个气泡相互比较大小,如果前面的气泡比后面的还要大,它们就会互换位置,“咕咚”一声,大的气泡就像被吹到了后面。就这样,一轮轮吹过去,每一圈结束后,最大的气泡就会自然而然地“浮”到最右边。接着,你再次从头开始吹,只不过这次可以少吹一个已经到位的大气泡,因为你知道它已经是最大的了。这个过程重复,直到所有的气泡都乖乖地按大小顺序排列好了。

#include <iostream>
using namespace std;

void bubbleSort(int arr[], int n) {
    // 外层循环控制需要进行几轮比较
    for (int i = 0; i < n - 1; i++) {
   
        // 内层循环负责具体的比较和交换操作
        for (int j = 0; j < n - 1 - i; j++) {
            // 如果前一个元素大于后一个元素,则交换它们
            if (arr[j] > arr[j + 1]) {
                swap(arr[j], arr[j + 1]);//swap为交换函数,swap(a,b)交换a和b的值
                
            }
        }
        
    }
}

int main() {
    int arr[] = {64, 34, 25, 12, 22, 11, 90};
    int n =7;
    bubbleSort(arr, n);
    cout << "排序后的数组: \n";
    for(int i=0; i < n; i++)
        cout << arr[i] << " ";
    return 0;
}

sort()函数 

时间复杂度:O(nlogn)

古代有弓箭,现代有步枪,弓箭虽然能杀敌,但是手动攻击速度很慢,步枪则是自动,突突突贼快。前面说的冒泡排序就是手动排序过程,对于一个数组要写好几行代码才能排序完成,并且时间复杂度为O(n^2)较高。

现在介绍一个自动挡排序,sort()函数。

sort(数组名+第一个下标,数组名+需要排序的个数)

//从小到大排序
//如果有一个数组,从0开始输入,有n个
	for(int i=0;i<n;i++)
	{
		cin>>a[i];
	 } 
	 sort(a,a+n);
	
	//如果有一个数组,从1开始输入,有n个
	for(int i=1;i<=n;i++)
	{
		cin>>a[i];
	 } 
	 sort(a+1,a+n+1);

 那如果想要从大到小怎么办呢?

需要添加一个自己写的bool类型的cmp函数来控制。

#include<bits/stdc++.h>
using namespace std;
bool cmp(int x,int y)
{
	return x>y;//从大到小 
}
int main()
{
	//如果有一个数组,从0开始输入,有n个
	for(int i=0;i<n;i++)
	{
		cin>>a[i];
	 } 
	 sort(a,a+n,cmp);
	
	//如果有一个数组,从1开始输入,有n个
	for(int i=1;i<=n;i++)
	{
		cin>>a[i];
	 } 
	 sort(a+1,a+n+1,cmp);
	return 0;
}

这样一来是不是简单多了呢,好几行的代码直接压缩成一行就可以了。通常排序操作是在一个题目中一个很小的部分,如果排序需要自己手写那么长,会使得代码可读性变低并且降低写题速度。

 练习场

P1177 【模板】排序 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

P1271 【深基9.例1】选举学生会 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

P1781 宇宙总统 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

P1059 [NOIP2006 普及组] 明明的随机数 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

P1093 [NOIP2007 普及组] 奖学金 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

P1068 [NOIP2009 普及组] 分数线划定 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

P1051 [NOIP2005 提高组] 谁拿了最多奖学金 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

白看不如一练,只有实践才是进步最快的方式,更要独立思考,如果想不出来了就看题解,会有眼前一亮的感觉。好啦,今天就到这里吧。下一期再见,记得给专栏点个关注,明天接着来哦~

标签:arr,新手村,洛谷,int,luogu,算法,奇境,排序,com
From: https://blog.csdn.net/X_StarX/article/details/139419877

相关文章

  • Floyd判圈算法 leetcode
    龟兔赛跑/Floyd判圈算法概述判断一个链表是否存在环画图演示两个指针相遇的情况:查找链表中环的首个节点在这里插入图片描述数学公式表示为:(对应力扣142.环形链表II,141.环形链表I)判断一个链表是否存在环龟兔赛跑/Floyd判圈算法转换成判断链表是否存......
  • 2024年计算机视觉、设计与算法国际会议( ICCVDA 2024)
    2024年计算机视觉、设计与算法国际会议( ICCVDA2024)会议简介本次大会旨在建立一个国际性的学术交流和合作平台,重点关注计算机视觉领域的最新进展、设计与算法的创新应用,分享前沿研究成果,并探索未来发展趋势。我们诚挚邀请全球各地的学者、专家、企业代表及感兴趣的个人积......
  • 揭秘《庆余年算法番外篇》续集:范闲通过最大似然法推理找到火烧史家镇的凶手
    揭秘《庆余年算法番外篇》:范闲通过贝叶斯推理找到太子火烧使家镇的证据上次写了这篇文章之后,很多留言说开了上帝视角,先假设了二皇子和太子有罪,这次通过最大似然法进行推导。方法介绍:最大似然法是一种在概率统计中广泛使用的参数估计方法。该方法基于一组已知的样本数据,旨......
  • 机器学习_分类算法详解
    机器学习中的分类算法是用于将输入数据分配到预定义类别中的算法。分类任务是监督学习的一种,模型根据训练数据中的输入-输出对进行学习,然后预测新的输入数据的类别。常见的分类算法包括:逻辑回归(LogisticRegression)k-近邻(k-NearestNeighbors,k-NN)支持向量机(SupportVecto......
  • 机器学习_聚类算法详解
    聚类算法是无监督学习的一种,主要用于将数据集中的样本划分为若干个簇,使得同一簇内的样本具有较高的相似度,而不同簇之间的样本差异较大。以下是几种常见的聚类算法及其详细讲解:1.K-means聚类原理K-means是一种迭代优化算法,目标是将数据集分成K个簇,每个簇由一个中心点......
  • 文心一言 VS 讯飞星火 VS chatgpt (273)-- 算法导论20.2 8题
    八、假设设计了这样一个proto-vEB结构,其中每个簇数组仅有u14u^\frac{1}{......
  • 基于粒子群算法优化Kmeans聚类的居民用电行为分析研究(Matlb代码实现)
     ......
  • 【图像去噪】基于原始对偶算法优化的TV-L1模型进行图像去噪研究(Matlab代码实现)
    ......
  • 模式匹配---kmp算法
    模式匹配--Kmp算法暴力匹配暴力匹配,既普通模式匹配,主串一个一个地与子串进行比对,一旦匹配失败就跳回主串原指针的下一个重新回溯,子串跳回第一个,重新开始匹配。主串BABCBFDAB下标012345678子串BCB主串原指针指向下标为......
  • 求一个算法思路,类似一维装箱?
    有很多小矩形(膜材料和长度可能不一样,但是高度是统一的):a120,a250,b12,b200,c300,c450,…字母表示膜的材料,数值表示长度。要将这些矩形进行分类,变成更大的矩形(水平平铺,不同的膜材料可以放在一起,但是不同材质的矩形之间要留10毫米间距,相同材质的可以紧密接触)。比如:(a120,a250,c30......