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

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://xiahunao.cn/news/2871437.html

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

相关文章

vulnhub-----SickOS靶机

文章目录 1.信息收集2.curl命令反弹shell提权利用POC 1.信息收集 ┌──(root㉿kali)-[~/kali/vulnhub/sockos] └─# arp-scan -l Interface: eth0, type: EN10MB, MAC: 00:0c:29:10:3c:9b, IPv4: 10.10.10.10 Starting arp-scan 1.9.8 with 256…

移动端研发技术的进化历程

移动端研发技术 移动端研发技术主要分为原生开发和跨平台开发。本章主要介绍一下移动开发技术的过去、当下和未来&#xff0c;一步一步介绍移动技术的进化历程。 原生开发 原生应用程序是指某一个移动平台&#xff08;比如iOS或Android&#xff09;所特有的应用&#xff0c;使…

【C/C++】C语言开发者必读:迈向C++的高效编程之旅

&#x1f9d1; 作者简介&#xff1a;阿里巴巴嵌入式技术专家&#xff0c;深耕嵌入式人工智能领域&#xff0c;具备多年的嵌入式硬件产品研发管理经验。 &#x1f4d2; 博客介绍&#xff1a;分享嵌入式开发领域的相关知识、经验、思考和感悟&#xff0c;欢迎关注。提供嵌入式方…

《1w实盘and大盘基金预测 day5》

从周预测到每天的预测都非常准。 主要的问题&#xff0c;操作股票情绪起伏太大&#xff0c;对一些个股把握不准&#xff08;医疗乱我心&#xff09;&#xff0c;整体情况还是非常好的。得分A 本周行情展望&#xff08;基本得到验证&#xff09;&#xff1a; 大盘应该还是震荡…

章节2:单词本该这样记

为什么我们记不住单词&#xff1f; 单词不是被胡编乱造出来的&#xff0c;单词是有规律的&#xff0c;单词是符合人类的逻辑的。 单词实际意思结构意义历史文化 我们要怎么记单词&#xff1f; 掌握单词的结构规律了解与单词有关的历史文化灵活巧计&#xff0c;不要太拘泥于…

vue2+vant2+Laravel7 实现多图上传到七牛云

后端接口 1、路由&#xff0c;在 routes/api.php 中 Route::resource(photos, PhotoController)->only(store);2、创建对应控制器 <?php namespace App\Http\Controllers; use Illuminate\Http\Request;class PhotoController extends Controller {/**** 上传图片* p…

网络安全行业真的很内卷吗?

有一个特别流行的词语叫做“内卷”&#xff1a; 城市内卷太严重了&#xff0c;年轻人不好找工作&#xff1b;教育内卷&#xff1b;考研内卷&#xff1b;当然还有计算机行业内卷…… 这里的内卷当然不是这个词原本的意思&#xff0c;而是“过剩”“饱和”的替代词。 按照网络安…

【GPT-SOVITS-03】SOVITS 模块-生成模型解析

说明&#xff1a;该系列文章从本人知乎账号迁入&#xff0c;主要原因是知乎图片附件过于模糊。 知乎专栏地址&#xff1a; 语音生成专栏 系列文章地址&#xff1a; 【GPT-SOVITS-01】源码梳理 【GPT-SOVITS-02】GPT模块解析 【GPT-SOVITS-03】SOVITS 模块-生成模型解析 【G…

每日五道java面试题之mybatis篇(三)

目录&#xff1a; 第一题. MyBatis的框架架构设计是怎么样的?第二题. 为什么需要预编译?第三题. Mybatis都有哪些Executor执行器&#xff1f;它们之间的区别是什么&#xff1f;第四题. Mybatis中如何指定使用哪一种Executor执行器&#xff1f;第五题. Mybatis是否支持延迟加载…

龙芯新世界系统(安同AOCS OS)安装Cinnamon桌面最新版6.0.4

龙芯的新世界系统安同AOCS OS是十分优秀的操作系统&#xff0c;处于纯社区方式运行&#xff0c;她的各组件更新得很及时&#xff0c;很多组件都处于最新的状态&#xff0c;给我们安装使用最新的开源软件提供了很好的基础。由于本人一直使用Cinnamon桌面环境&#xff0c;各方面都…

鸿蒙开发实战:【Faultloggerd部件】

theme: z-blue 简介 Faultloggerd部件是OpenHarmony中C/C运行时崩溃临时日志的生成及管理模块。面向基于 Rust 开发的部件&#xff0c;Faultloggerd 提供了Rust Panic故障日志生成能力。系统开发者可以在预设的路径下找到故障日志&#xff0c;定位相关问题。 架构 Native In…

【Linux】对进程PCB的理解查看进程信息的方法

一、学习准备&#xff1a;对操作系统工作模式的理解 首先我们要清楚的是&#xff0c;操作系统是一个进行软硬件资源管理的软件。操作系统对下要管理好底层硬件。每一个硬件的生产产商都会给他们的产品提供对应的驱动程序&#xff0c;驱动程序是特定于某一硬件或系统设备的软件组…

【CTF web1】

CTF web 一、CTF web -PHP弱类型1、是否相等&#xff1f;2、转换规则: 二、CTF web -md5绕过1、若类型比较绕过2、null绕过3、碰撞绕过 三、习题 一、CTF web -PHP弱类型 1、是否相等&#xff1f; &#xff1a;在进行比较的时候&#xff0c;会先判断两种字符串的类型是否相等&…

Flink程序员开发利器本地化WebUI生成

前言 在flink程序开发或者调试过程中&#xff0c;每次部署到集群上都需要不断打包部署&#xff0c;其实是比较麻烦的事情&#xff0c;其实flink一直就提供了一种比较好的方式使得开发同学不用部署就可以观察到flink执行情况。 上代码 第一步&#xff1a;开发之前需要引入在本…

快速获取网页所有图片/获取网页电子资源内的图片

有时候看一些电子资源/电子教案过程中&#xff0c; 想把这些图下载下来&#xff0c;但是不能一个个截图 在之前的文章介绍了使用IDM软件下载所有的图片的方式&#xff0c;这种方式需要获取一个图片的地址并迭代 但是今天又发现了一种更快捷方式&#xff0c;是在浏览器控制台…

粤嵌6818嵌入式开发入门教程

学习目标 1.了解嵌入式开发 2.开发环境的搭建 3.Linux操作系统的基本操作 一、了解嵌入式开发 以应用为中心&#xff0c;以计算机技术为基础&#xff0c;软硬件可裁剪&#xff0c;适应应用系统对功能、可靠性、成本、体积、功耗严格要求的专用计算机系统。 1.嵌入式可以干…

SpringTask实现的任务调度与XXL-job实现的分布式任务调度【XXL-Job工作原理】

目录 任务调度 分布式任务调度 分布式任务调度存在的问题以及解决方案 使用SpringTask实现单体服务的任务调度 XXL-job分布式任务调度系统工作原理 XXL-job系统组成 XXL-job工作原理 使用XXL-job实现分布式任务调度 配置调度中心XXL-job 登录调度中心创建执行器和任务 …

C++——类和对象(3)

目录 1. 拷贝构造 1.1 概念 1.2 特性 ​编辑 2. 赋值重载 和 运算符重载 2.1 运算符重载 2.2 赋值重载 此篇文章讲解六个默认成员函数中的 拷贝构造和赋值重载 。 1. 拷贝构造 1.1 概念 拷贝构造&#xff1a; 在创建对象的时候用已经创建好的对象去初始化一个新对象&am…

解决分布式事务,Seata真香!

年IT寒冬&#xff0c;大厂都裁员或者准备裁员&#xff0c;作为开猿节流主要目标之一&#xff0c;我们更应该时刻保持竞争力。为了抱团取暖&#xff0c;林老师开通了《知识星球》&#xff0c;并邀请我阿里、快手、腾讯等的朋友加入&#xff0c;分享八股文、项目经验、管理经验等…

Java八股文(MyBatis Plus)

Java八股文のMyBatis Plus MyBatis Plus MyBatis Plus MyBatis Plus 是什么&#xff1f;它与 MyBatis 有什么区别&#xff1f; MyBatis Plus 是基于 MyBatis 进行扩展的一款持久层框架&#xff0c;它提供了一系列增强功能&#xff0c;简化了 MyBatis 的使用。 与 MyBatis 相比…