《啊哈算法》第一章典例+解析+代码

news2024/10/7 18:31:13

目录

一,计数排序

二,冒泡排序(Bubble Sort)

三,快速排序(Quick Sort)

四,桶排序(Bucket Sort)

五,小哼买书


从无到有掌握最基础的算法

多学点算法,做题时就能拓宽思路;一种简单的算法思路,能将看起来很复杂的问题,变得简单

关于冒泡排序,快速排序和桶排序

冒泡

最慢的,只在数据量很小时能用,时间复杂度为O(n^2)

快排(推荐)

万金油(最常用),包含分治的思想,复杂度为O(N*logN),类似sort()

桶排序

时间复杂度最低(最快),为O(N + C),N为循环次数,C为N*(logN - logM),M为桶数量

也含有分治的思想

它利用函数中映射的关系(即桶与数据一对多的关系),减少了大量比较,所以时间复杂度很低,正因为如此,导致空间复杂度很高,时间越快占用空间越多(桶的数量越多),当样本跨度较大不适用,比如对1000001,1,200099999,88进行排序,不会考虑桶排序

它只适用于数据均匀分布,元素值较为集中的序列

一,计数排序

它是桶排序的简化版本

比桶排序还浪费空间,比如需要排序的范围 0 ~ 2e9(2*10^9),就需要2*10^9个桶,也就是申请2*10^9个变量,即使只对3个数排序,仍需要这么大的空间,就很浪费

 eg: 5个同学分别考了5分,3分,5分,2分,8分,将分数从大到小排序并输出

#include<iostream>
using namespace std;
int a[9]; //全局数组自动初始化为0
int main()
{
    int t;
    for(int i = 0; i < 5; ++i) { //输入5次
        cin>>t; //分数
        a[t]++; //这个分数出现的次数
    }
    for(int i = 8; i >= 0; --i) //i为分数
        for(int j = 0; j < a[i]; ++j) //j为次数
            cout<<i<<" ";
    return 0;
}
5 3 5 2 8
8 5 5 3 2

二,冒泡排序(Bubble Sort)

每次比较相邻两个元素,如果顺序不对,就交换

比如下图就是一趟冒泡排序

 对n个数进行冒泡,需要将 n - 1 个数归位,也就是进行 n - 1 趟操作

eg: 有5个同学和自己的分数,Amy 5分, Mike 10分, Bob 6分, Girl 4分, Jhon 5分,按照分数从高到低输出他们的名字(涉及结构体

#include<iostream>
using namespace std;
struct stu
{
    char name[20];
    int score;
};
int main()
{
    struct stu a[10], t; //t要声明为结构体的变量
    int n = 5;
    for(int i = 0; i < n; ++i)
        cin>>a[i].name>>a[i].score;
    for(int i = 0; i < n - 1; ++i) //n - 1趟
        for(int j = 0; j < n - i - 1; ++j) { //每趟比上一趟少比较一次
            if(a[j].score < a[j + 1].score) {
                t = a[j];
                a[j] = a[j + 1];
                a[j + 1] = t; //交换结构体两个变量
            }
        }
    for(int i = 0; i < n; ++i)
        cout<<a[i].name<<" ";
    return 0;
}
Amy 5 Mike 10 Bob 6 Girl 4 Jhon 5
Mike Bob Amy Jhon Girl

三,快速排序(Quick Sort)

先上图

 

 

 

 假设左端第一个数字6为基数(便于后续参照),根据传入的左右边界声明 i, j两个游标

j游标先行,(假设从小到大排序)直到 j游标 指向的数字小于基数6,停止

i游标后走,直到 i游标 指向的数字大于基数6

i, j 指向的数字交换

重复上面的过程直到 i, j相遇(指向同一个数,这个数必然比基数6小)

然后相遇的数字再与左端基数6交换

此时中间的左边都比中间小,中间的右边都比中间大

后续分别对6的左边和右边递归就好

#include<iostream>
using namespace std;
int a[66666], n; //定义全局变量,可在子函数使用
void quick_sort(int left, int right)
{
    if(left > right)
        return; //终止条件,说明当前数组长度为1或物理不存在
    int i, j, base;
    i = left, j = right, base = a[left];
    while(i < j) {
        while(i < j && a[j] >= base)
            j--; //j游标先行
        while(i < j && a[i] <= base)
            i++;
        if(i < j) {
            a[i] = a[i]^a[j];
            a[j] = a[i]^a[j];
            a[i] = a[i]^a[j]; //异或交换两个数
        }
    }
    a[left] = a[j];
    a[j] = base; //基数与指向的数交换
    quick_sort(left, j - 1); //对左边递归
    quick_sort(j + 1, right); //对右边递归
}
int main()
{
    cin>>n; //n个数
    for(int i = 0; i < n; ++i)
        cin>>a[i];
    quick_sort(0, n - 1);
    for(int i = 0; i < n; ++i)
        cout<<a[i]<<" ";
    return 0;
}
7
-50 666 99 12 -2 36 2
-50 -2 2 12 36 99 666

详细点的可以看这个

 (5条消息) C++快速排序之整型数组_码龄11天的博客-CSDN博客_c++整数排序

四,桶排序(Bucket Sort)

与快排的区别:

快排将集合分为两个桶,对两个桶按快排排序,它是在集合本身上的排序,即原地排序

桶排序将集合分为多个桶,在额外空间上对桶进行排序,避免了构成桶过程中元素的比较和交换

算法过程:

1,Max和Min

遍历数组,得到最大值Max和最小值Min

2,桶的个数

(Max - Min) / 间隔 + 1 = 桶的个数,

比如Max == 666, Min == -28,每个桶间隔假设100,则桶的个数为 694 / 100 + 1 = 7

3,放入桶

遍历数组,将元素加入对应区间的桶中

4,对桶排序(方法自选)

5,将桶内元素放回原序列

意思就是这么个意思,不想敲了,书里没有

五,小哼买书

就是对输入的数组进行排序和去重,很简单我就不写了

可以考虑先排序,如果和上一个不相等,就输出

相等则代表重复,不输出

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

react hooks 封装一个countDown 倒计时组件

开发技术 react , hooks , ts , taro 需求分析 需要一个可以按天&#xff0c;时&#xff0c;分和秒来进行倒计时的组件。 简单使用 注&#xff1a;主要逻辑请看 useCountDown import CountDown from /components/countDown; import { useEffect, useState } from react; i…

东宝商城项目(二)——flask-script模块、flask-migrate模块和项目日志配置

学习flask-script模块的使用 1、什么是flask-script flask-script是flask的一个扩展模块&#xff0c;Flask-Script的作用是可以通过命令行的形式来操作Flask。 2、安装flask-script pip install flask-script 3、flask-script的使用 例如有这样一种需求&#xff1a; 我们…

李彦宏开年定调“百度式创新”:反馈驱动,坚定技术

今天在百度热搜看到这么一条置顶话题&#xff0c;让我印象深刻&#xff1a;读懂中国经济的信心所在。 站在2023年起点&#xff0c;无论你是阳了、没阳&#xff0c;还是阳康了&#xff0c;之于个人、企业组织&#xff0c;都太需要信心和激励了。 点进去后是一篇来自《人民日报 …

小程序直播加速抢占电商流量先机

临近春节&#xff0c;到了购置年货的时候&#xff0c;相信有不少小伙伴被淘宝、拼多多、抖音等各大平台的直播卖货吸引。近年来&#xff0c;大家逐渐发现视频直播的影响力已经渗透到各行各业&#xff0c;通过直播带来的流量&#xff0c;不少商家赚得盆满钵满。视频直播这块流量…

Autosar MCAL-GPT配置及使用

文章目录前言GPTGptChannelConfigSetGptChannelIdGptChannelModeGptChannelTickFrequencyGptChannelTickValueMaxGptEnableWakeupGptNotificationGptChannelClkSrcRefGptAssignedHwUnitGptConfigurationOfOptApiServicesGptDeinitApiGptEnableDisableNotificationApiGptTimeEla…

系列33 Flow_Model

Introduction 在上一小节中讲到了Latent Variable Model&#xff08;LAM&#xff09;&#xff0c;VAE。其主要思想就是将隐变量扩充为高维连续的分布&#xff0c;来增强模型的表达能力。而LAM模型中的核心困难是计算不出来&#xff0c;因为&#xff0c;而的维度过高算不出来。而…

GAN Step By Step -- Step7 WGAN

GAN Step By Step 心血来潮 GSBS&#xff0c;顾名思义&#xff0c;我希望我自己能够一步一步的学习GAN。GAN 又名 生成对抗网络&#xff0c;是最近几年很热门的一种无监督算法&#xff0c;他能生成出非常逼真的照片&#xff0c;图像甚至视频。GAN是一个图像的全新的领域&#…

2022 OceanBase 年度报告|用技术让海量数据的管理和使用更简单!

尊敬的各位客户、合作伙伴和开发者&#xff1a; 从 2020 年 6 月 1 日 OceanBase 开启商业化至今&#xff0c;我们一起走过了 900 多天。 从 0.5 到 3.x&#xff0c;我们花了近十年时间&#xff0c;而从 3.x 到 4.x 只用了不到两年&#xff0c;这是 OceanBase 和客户、伙伴、…

C++ 开发环境其实挺难搞的(上)

所谓工欲善其事&#xff0c;必先利其器&#xff0c;我将用两节课的内容向大家介绍 C 的开发工具及开发环境的一些知识。 Visual Studio 诞生至今已有 25 年以上的历史&#xff0c;功能强大&#xff0c;用的人非常多&#xff0c;社区的朋友戏称它为宇宙最强大的 IDE&#xff0c…

LeetCode 147. 对链表进行插入排序

&#x1f308;&#x1f308;&#x1f604;&#x1f604; 欢迎来到茶色岛独家岛屿&#xff0c;本期将为大家揭晓LeetCode 147. 对链表进行插入排序&#xff0c;做好准备了么&#xff0c;那么开始吧。 &#x1f332;&#x1f332;&#x1f434;&#x1f434; 一、题目名称 二、…

ECC原理和RocketChip Cache ECC实现

一、ECC原理说明ECC(Error Correcting Code)全称为错误纠正码&#xff0c;用于对存储器的数据进行完整性检查和纠正&#xff0c;主要用在SRAM、DDR、NAND等存储器设备上。ECC可以对数据进行单比特的纠错和多比特的检错&#xff0c;其原理基于汉明码编码而来。下图是ECC编码的主…

如何通过光耦合器连接继电器

如何通过光耦合器连接继电器 介绍 以下文章介绍如何使用隔离方法或通过光耦合器器件驱动继电器。我们将学习三种方法&#xff0c;第一种方法是将继电器直接连接到光耦合器输出引脚&#xff0c;第二种方法是使用外部PNP晶体管&#xff0c;第三种方法是使用外部NPN晶体管。任何…

二十九、Docker (5)

&#x1f33b;&#x1f33b; 目录一、Maven Docker 插件构建 Docker 镜像1.1 maven Docker 插件构建 Docker 镜像入门1.2 maven Docker 插件构建 Docker 镜像&#xff0c;自定义 DockerFile1.3 maven Docker 插件构建并推送镜像到 Docker 私有仓库二、手动发布部署微服务项目到…

类与对象(三):stactic成员、友元、内部类

类与对象&#xff08;三&#xff09;1. 再谈构造函数1.1 构造函数体赋值1.2 初始化列表1.3 explicit关键字2. static成员2.1 概念特性类中成员变量区别&#xff08;普通变量和static变量&#xff09;:普通成员函数和静态成员函数的区别3. 友元友元函数友元类cout打印自定义类型…

24种代码坏味道和重构手法

最近&#xff0c;小李感觉公司女生们看他的眼神不太对劲了&#xff0c;那种笑容好像是充满慈爱的、姨母般的笑容。 作为一名老实本分的程序员&#xff0c;小李不太习惯这种被人过度关注的感觉&#xff0c;他不知道发生了什么。 小李和小王的关系似乎过于亲密&#xff0c;还经…

ZooKeeper 安装

ZooKeeper 安装 1. 下载安装 1、环境准备 ZooKeeper服务器是用Java创建的&#xff0c;它运行在JVM之上。需要安装JDK 7或更高版本。 2、上传 将下载的ZooKeeper放到/opt/ZooKeeper目录下 #上传zookeeper altp put f:/setup/apache-zookeeper-3.5.6-bin.tar.gz #打开 opt目…

(十)devops持续集成开发——jenkins流水线发布一个docker harbor仓库版的后端maven项目

前言 本节内容我们使用jenkins流水线组件发布一个docker环境的后端maven项目&#xff0c;并使用docker的harbor仓库完成镜像的存储&#xff0c;通过拉取harbor仓库中的项目镜像&#xff0c;完成后端项目的发布&#xff0c;关于harbor仓库的搭建&#xff0c;可以参考往期博客内…

Python学习笔记之模块

可迭代对象 概念&#xff1a;更新换代&#xff0c;每次更新都是根据上一次的结果作为基础。 有哪些&#xff1a;字符串&#xff0c;列表&#xff0c;字典&#xff0c;元组&#xff0c;集合&#xff0c;文件对象&#xff0c;特殊函数&#xff08;生成器&#xff09; 迭代器对…

软件测试/测试开发 | AppCrawler 自动遍历测试工具实践(一)

本文为霍格沃兹测试学院学院学员课程学习笔记。 公众号搜索&#xff1a;TestingStudio 霍格沃兹的干货都很硬核 AppCrawler 是由霍格沃兹测试学院校长思寒开源的一个项目&#xff0c;通过名字我们大概也能猜出个方向&#xff0c;Crawler 是爬虫的意思&#xff0c;App 的爬虫&am…

GitHub上标星79K的LeetCode算法小抄开放下载了

在大厂面试中我们不可避免的会考到算法&#xff0c;为什么大厂一定要考察算法呢&#xff1f;因为它包含了太多的逻辑思维&#xff0c;可以考察你思考问题的逻辑和解决问题的能力&#xff1b;这一点也是面试官比较看重的&#xff0c;因为它可以反映出你的潜力&#xff0c;我曾经…