用c++实现计数排序、颜色排序问题

news2024/11/24 13:57:15

3.3.1 计数排序

【问题】 假设待排序记录均为整数且取自区间[0,k],计数排序(count sort)的基本思想是对每一个记录x,确定小于x的记录个数,然后直接将x放在应该的位置。例如,小于x的记录个数是10,则x就位于第11个位置。
【想法】 对于待排序序列 A[n]=(2,1,5, 2,4, 3, 0,5, 3, 2)k=5, 首先统计值为i(0<=i<= k)的记录个数存储在 num[i]中,则 num[k]=(1,1,3,2,1,2), 再统计小于等于i(1<=i<=k)的记录个数存储在 num[i]中,则 num[k]=(1, 2,5, 7, 8, 10),最后反向读取数组 A[n]填到数组 B中,例如读取 A[9]的值是2,则将 num[2]减1,然后将2填到 B[4]中,如图3-3所示。注意,统计小于i(1<=i<=k)的记录个数不能就地进行(利用数组 num),需要再设一个数组存放小于i的记录个数,就可以正向读取数组 A[n]。


【算法】 设函数 CountSort 实现计数排序,数组 num[k+1]存储每个记录出现的次数以及小于等于值为i的记录个数,算法如下。
算法:计数排序 CountSort
输入:待排序记录序列 A[n],记录的取值区间k
输出:排序数组 B[n]
1.统计值为i的记录个数存入 num[i];
2.统计小于等于i的记录个数存人 num[i];
3.反向填充目标数组,将 A[i]放在 B[--num[A[i]]]中;
4.输出数组B[n];

【算法分析】 计数排序是一种以空间换时间的排序算法,并且只适用于对一定范围内的整数进行排序,时间复杂度为O(n+k),其中k为序列中整数的范围。
【算法实现】 计数排序的关键在于确定待排序记录 A[i]在目标数组B[n]中的位置,由于数组元素 num[i]存储的是A[n]中小于等于i的记录个数,所以填充数组 B[n]时要反向读取 A[n]。程序如下:

#include <iostream>
using namespace std;

void CountSort(int A[ ], int n, int k, int B[ ])
{
int i, num[k+1] = {0};
for(i = 0; i < n; i++)
num[A[i]]++;
for (i = 1; i <= k; i++)
num[i] = num[i] + num[i-1];
for (i = n-1; i >= 0; i--)
B[--num[A[i]]] = A[i];
}
int main( )
{
int n = 10, k = 5, i;
    int A[n] = {2, 1, 5, 2, 4, 3, 0, 5, 3, 2};  // 修改数组大小声明为 n
    int B[n];  // 修改数组大小声明为 n
    for (i = 0; i < n; i++) {
        cout << A[i] << " ";  // 输出 A 数组的元素
    }
    cout << endl;
    CountSort(A, n, k, B);  // 调用 CountSort 函数进行排序
    for (i = 0; i < n; i++) {
        cout << B[i] << " ";  // 输出排序后的 B 数组的元素
    }
}

3.3.2 颜色排序

【问题】现有 Red、Green 和 Blue 三种不同颜色(色彩中不能再分解的三种颜色, 称为三原色)的小球,乱序排列在一起,请按照 Red、Green 和 Blue 顺序重新排列这些小球,使得相同颜色的小球排在一起。
【想法】 设数组a[n]存储 Red、Green 和 Blue 三种元素,设置三个参数i、j、k,其中i之前的元素(不包括a[i])全部为 Red;k 之后的元素(不包括 a[k])全部为 Blue;i和j之间的元素(不包括 a[j])全部为 Green;j指向当前正在处理的元素。首先将i初始化为0, k初始化为n—1,j初始化为0。然后j从前向后扫描,在扫描过程中根据a[j]的颜色,将其交换到序列的前面或后面,当j等于k时,算法结束。颜色排序的求解思想如图3-4所示。

注意,当j扫描到 Red时,将a[i]和a[j]交换,只有当前面全部是Red时,交换到位置j的元素是 Red,否则交换到位置j的元素一定是Green,因此交换后j应该加1;当j扫描到 Blue时,将a[k]和a[j]交换, Red、Green 和Blue均有可能交换到位置j,则a[j]需要再次判断,因此交换后不能改变j的值。
【算法】 设数组 a[n]有 Red,Green和 Blue 三种元素,函数 ColorSort 实现颜色重排问题,算法如下。

算法:颜色排序 ColorSort

 输入:待排序记录序列a[n]

输出:排好序的数组 a[n]
1.初始化i=0;k=n-1;j=0;
2.当j<=k时,依次考查元素a[j],有以下三种情况:
(1)如果a[j]是Red,则交换 a[i]和a[j];i++;j++;

(2)如果 a[j]是Green,则j++;
(3)如果 a[j]是 Blue, 则交换 a[k]和 a[j];--;
【算法分析】 由于下标j和k整体将数组扫描一遍,因此时间复杂度为O(n)。
【算法实现】 由于数组 a[n]只有三种元素,假设 Red、Green 和 Blue 三种颜色分别用1、2、3来代替,程序如下。

#include <iostream>
using namespace std;


void ColorSort(int a[ ], int n)
{
int i = 0, k = n - 1, j = 0, temp;
while (j <= k)
switch (a[j]) //考查当前元素
{
case 1: temp = a[i]; a[i] = a[j]; a[j] = temp; i++; j++; break;
case 2: j++; break;
case 3: temp = a[j]; a[j] = a[k]; a[k] = temp; k--; break;
}
}

int main( )
{
int n = 10, i, a[n] = {2, 1, 3, 2, 3, 3, 1, 2, 3, 2};
for (i = 0; i < n; i++)
cout<<a[i]<<" ";
cout<<endl;
ColorSort(a,n);
for (i = 0; i < n; i++)
cout<<a[i]<<" ";
 return 0;
}

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

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

相关文章

计算机设计大赛 题目:基于机器视觉的图像矫正 (以车牌识别为例) - 图像畸变校正

文章目录 0 简介1 思路简介1.1 车牌定位1.2 畸变校正 2 代码实现2.1 车牌定位2.1.1 通过颜色特征选定可疑区域2.1.2 寻找车牌外围轮廓2.1.3 车牌区域定位 2.2 畸变校正2.2.1 畸变后车牌顶点定位2.2.2 校正 7 最后 0 简介 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享…

【大模型系列】问答理解定位(Qwen-VL/Llama2/GPT)

文章目录 1 Qwen-VL(2023, Alibaba)1.1 网络结构1.2 模型训练 2 Llama2(2023, Meta)2.1 网络结构2.1.1 MHA/GQA/MQA2.1.2 RoPE(Rotary Position Embedding, 旋转式位置编码)2.1.3 RMSNorm 2.2 推理2.2.1 集束搜索(beam search)2.2.2 RoPE外推 3 GPT系列(OpenAI) 1 Qwen-VL(2023…

免费开源多层级多标签文本分类|文本分类接口|文本自动分类

一、开源项目介绍 一款多模态AI能力引擎&#xff0c;专注于提供自然语言处理&#xff08;NLP&#xff09;、情感分析、实体识别、图像识别与分类、OCR识别和语音识别等接口服务。该平台功能强大&#xff0c;支持本地化部署&#xff0c;并鼓励用户体验和开发者共同完善&#xf…

【集成开发环境】-VS Code:C/C++ 环境配置

简介 VS Code&#xff0c;全称Visual Studio Code&#xff0c;是一款由微软开发的跨平台源代码编辑器。它支持Windows、Linux和macOS等操作系统&#xff0c;并且具有轻量级、高效、可扩展等特点&#xff0c;深受广大开发者的喜爱。 VS Code拥有丰富的功能特性&#xff0c;包括…

6.【Linux】进程间通信(管道命名管道||简易进程池||简易客户端服务端通信)

介绍 进程间通信的方式 1.Linux原生支持的管道----匿名和命名管道 2.System V-----共享内存、消息队列、信号量 3.Posix------多线程、网路通信 进程间通信目的 数据传输&#xff1a;一个进程需要将它的数据发送给另一个进程 资源共享&#xff1a;多个进程之间共享同样的资源。…

科研学习|论文解读——了解在线环境中的多数观点形成过程:Facebook的探索性方法(IPM, 2018)

论文标题 Understanding the majority opinion formation process in online environments: An exploratory approach to Facebook 摘要 在在线社区的社会互动过程中&#xff0c;多数观点经常被观察到&#xff0c;但很少有研究用实证数据来解决这一问题。为了确定一个合适的理论…

解决MySQL密码无法设置问题

引言 当我们第一次在Linux中安装好MySQL服务后&#xff0c;使用如下命令可以查看第一次进入MySQL的临时密码。 cat /var/log/mysqld.log | grep password但是我们如何修改它为自己想要的永久MySQL密码呢&#xff1f;在修改过程中出现的密码太短而无法设置的问题如何解决呢&am…

2024 新版 mysql 和 DBeaver 的安装教程,来啦!

mysql community 官网&#xff1a;https://dev.mysql.com/ DBeaver Community 官网&#xff1a;https://dbeaver.io/download/ 1. mysql 安装教程 进入官网 这里我选择的是社区版&#xff08;对于新手来说&#xff0c;学生是再好不过了&#xff0c;免费又开源&#xff09; 选择…

图解Transformer——注意力计算原理

文章目录 1、输入序列怎样传入注意力模块 2、进入注意力模块的矩阵的每一行&#xff0c;都是源序列中的一个词 3、每一行&#xff0c;都会经过一系列可学习的变换操作 4、如何得到注意力分数 5、Query、Key、Value的作用 6、点积&#xff1a;衡量向量之间的相似度 7、Transform…

如何使用机器学习构建自己的推荐系统?

一、说明 在广阔的电子商务领域&#xff0c;众多产品和服务都在争夺我们的注意力&#xff0c;推荐系统的作用变得至关重要。这些智能系统彻底改变了我们在线发现和接触产品的方式&#xff0c;使其成为现代电子商务平台成功的基石。 推荐系统&#xff0c;通常称为推荐引擎或简称…

The service already exists!怎么解决,Windows怎么安装/卸载服务?

问题描述 有时候,我们在Windows系统上安装服务时会遇到报错,The service already exists! 问题分析 这个报错说明此服务已经存在了,所以我们不能再次安装,但有时候我们明明是第一次安装,为什么也会报这个错误呢? 在Windows上注册服务通常需要使用命令行工具或者特定的…

如何降低node.js版本(nvm下载安装与使用)

一、问题场景 项目打包时提示以下错误 error js/chunk-f9fc6130.f14f870a.js from Terser Error: error:0308010C:digital envelope routines::unsupportedat new Hash (node:internal/crypto/hash:71:19)at Object.createHash (node:crypto:133:10) 这个错误提示表明在执行Ter…

大模型学习笔记(一):部署ChatGLM模型以及stable-diffusion模型

大模型学习笔记&#xff08;一&#xff09;&#xff1a;部署ChatGLM模型以及stable-diffusion模型 注册算力平台&#xff08;驱动云平台&#xff09;1.平台注册2.查看算力3.进入平台中心 部署ChatGLM3-6B模型1.创建项目2.配置环境设置镜像源、克隆项目修改requirements 3.修改w…

leetcode刷题日记之串联所有单词

题目描述 解题思路 一开始考虑的就是暴力破解&#xff0c;每次切片切words中字母的个数&#xff0c;然后根据每个词语的长度进行进一步的切片&#xff0c;将切出来的单词放入列表&#xff0c;然后每次对比一次&#xff0c;如果存在&#xff0c;就从原来的列表中&#xff0c;删…

AcWingP1101. 献给阿尔吉侬的花束-bfs(宽度优先搜索)

题目链接 搜宽&#xff1a;每次取出队头元素&#xff0c;然后将该队头元素扩展出的所有元素放到队尾 需要的数组&#xff1a; 判重数组&#xff1a;st[] 一般是入队时判重&#xff08;这样可以保证每一个点入队一次&#xff09;queue 队列 宽搜一般模板 queue <- 初始…

webots的安装和体验

刚知道webots是一个机器人仿真软件&#xff0c;好像离开硬件可以自己玩玩&#xff0c;而且有人形机器人的源代码&#xff0c;试试看吧。 Cyberbotics: Robotics simulation with Webotshttps://www.cyberbotics.com/ 官网下载&#xff0c;有windows版本&#xff0c;看上去好简…

java小型人事管理系统

开发工具&#xff1a; MyEclipseJdkTomcatSQLServer数据库 运行效果视频&#xff1a; https://pan.baidu.com/s/1hshFjiG 定制论文&#xff0c;联系下面的客服人员

微服务网关Spring Cloud Gateway有什么作用?

一、背景 现在的spring cloud生态中&#xff0c;spring cloud gateway是一个非常重要的组件。它是一款API网关服务&#xff0c;在微服务架构中扮演了关键角色&#xff0c;它为微服务架构中的请求提供了路由、转发和过滤的功能。此外&#xff0c;还提供了负载均衡、限流和鉴权的…

ARCGIS PRO SDK 图层唯一值渲染

一、如果【地块回退】为面, 按"DKMC"字段&#xff0c;在面中心配置符号Pushpin Await QueuedTask.Run(Sub()pFeaturelayer pmap.FindLayers("地块回退").First()-----------------唯一值渲染Dim Fields New List(Of String) From {"DKMC"} …

Unity中UGUI中的PSD导入工具的原理和作用

先说一下PSD导入工具的作用&#xff0c;比如在和美术同事合作开发一个背包UI业务系统时&#xff0c;美术做好效果图后&#xff0c;程序在UGUI中制作好界面&#xff0c;美术说这个图差了2像素&#xff0c;那个图位置不对差了1像素&#xff0c;另外一个图大小不对等等一系列零碎的…