一起学算法(计算排序篇)

news2025/1/22 16:14:08

概念:

计数排序(Counting sort)是一个非基于比较稳定的线性时间的排序算法

非基于比较:之前学的排序都是通过比较数据的大小来实现有序的,比如希尔排序等,而计数排序不需要比较数据的大小而进行排序,计数排序顾名思义就是根据计数进行排序

工作原理:使用一个额外的数组arr,其中第i个元素是待排序数组A中值等于i的元素的个数,然后根据数组arr来将A中的元素排到正确的位置上

 具体实现:创建一个足够大的数组arr,足够大的意思是arr的下标范围可以包括所有的待排序数据值,然后遍历待排序数据,使用计数法统计每个数据出现的次数,最后遍历arr数组,将每一个值(arr[i])的下标(i)放入arr[i]次

// 计数排序
    // 求数组中元素的最大值
    private int getMaxVal(int[] arr) {
        return Arrays.stream(arr).max().getAsInt();
    }

    public void countSort(int[] arr) {
        // 对数组进行判断
        if (arr == null || arr.length < 2) {
            return;
        }
        // 获取数组中最大值
        int max = getMaxVal(arr);
        //  创建一个比max多1个元素的数组
        int[] c = new int[max + 1];
        // 统计
        Arrays.stream(arr).forEach(item -> c[item]++);
        // 数组回填
        int index = 0;
        for (int i = 0; i < c.length; i++) {
            while (c[i] > 0) {
                arr[index++] = i;
                c[i]--;
            }
        }
    }

 计数排序的排序是不是和数组的索引有关,索引是>=0,所以是不是我们如果碰到数列中有负数的情况,计数排序就失效了呢?一般的计数排序确实是失效了,但是咋们是二班的技术排序,

离散化+技术排序

 // 离散化+计数排序
    public void countSort2(int[] arr) {
        // 去重,排序---形成离散化之后的数组
        int[] s = Arrays.stream(arr).distinct().sorted().toArray();
        // 创建一个统计数组
        int[] c = new int[s.length];
        // 进行统计
        // 从s数组中找arr[i]对应的索引
        Arrays.stream(arr).forEach(item -> {
            int index = find(s, item, 0, s.length - 1);
            c[index]++;
        });

        // 回填
        int index = 0;
        for (int i = 0; i < c.length; i++) {
            while (c[i] > 0) {
                arr[index++] = s[i];
                c[i]--;
            }
        }
    }

    // 二分查找法
    private int find(int[] arr, int num, int left, int right) {
        // 先找中间值
        while (left <= right) {
            int mid = left + (right - left) / 2;
            if (arr[mid] == num) {
                return mid;
            } else if (arr[mid] > num) {
                right = mid - 1;
            } else {
                left = mid + 1;
            }
        }
        return -1;
    }

 leetcode题单:

找不同

class Solution {
    public char findTheDifference(String s, String t) {
        if (s == null && t == null) {
            return '0';
        }
        int[] hash = new int[256];
        for (int i = 0; i <s.length(); i++) {
              hash[s.charAt(i)]++;
        }
        for (int i = 0; i <t.length(); i++) {
            hash[t.charAt(i)]++;
        }
        for (int i = 0; i <hash.length; i++) {
             if((hash[i]&1)==1){
                 return (char) (i);
             }
        }
        return '0';
    }
}

既不是最小值也不是最大值

class Solution {
    public int findNonMinOrMax(int[] nums) {
        if (nums.length < 3) return -1;
        countSort(nums); // 只对前三个数排序
        return nums[1];
    }
        public void countSort(int[] arr) {
        // 对数组进行判断
        if (arr == null || arr.length < 2) {
            return;
        }
        // 获取数组中最大值
        int max = getMaxVal(arr);
        //  创建一个比max多1个元素的数组
        int[] c = new int[max + 1];
        // 统计
        Arrays.stream(arr).forEach(item -> c[item]++);
        // 数组回填
        int index = 0;
        for (int i = 0; i < c.length; i++) {
            while (c[i] > 0) {
                arr[index++] = i;
                c[i]--;
            }
        }
    }
      private int getMaxVal(int[] arr) {
        return Arrays.stream(arr).max().getAsInt();
    }

}

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

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

相关文章

数据结构:谈快速排序的多种优化和非递归展开,以及排序思想归纳

文章目录 写在前面快速排序的基本体系快速排序的优化快速排序的非递归实现排序分类总结插入排序选择排序交换排序归并排序 写在前面 快速排序作为效率相当高的排序算法&#xff0c;除了对于特殊数据有其一定的局限性&#xff0c;在大多数应用场景中都有它特有的优势和应用&…

PHP8的数据类型转换-PHP8知识详解

什么是数据类型转换&#xff1f; 答&#xff1a;数据从一个类型转换成另外一个类型&#xff0c;就是数据类型转换。 在PHP8中&#xff0c;变量的类型就是由赋值决定的&#xff0c;也就是说&#xff0c;如果 string 赋值给 $var&#xff0c;然后 $var 的类型就是 string。之后…

Python:给MySQL创建1000张表和创建1张有50个字段的表

1、创建1000张表 import pymysqldbhost "10.1.1.143" dbuser "root" dbpassword "123456" dbname "demo_cg1000" dbport 3306 dbconn pymysql.connect(hostdbhost, userdbuser, passworddbpassword, dbdbname, portdbport)mycu…

前端学习--vue2--2--vue指令基础

写在前面&#xff1a; 前置内容 - vue配置 文章目录 插值表达式v-html条件渲染v-show和v-ifv-ifv-if的扩展标签复用组件 v-show v-on /事件v-bind /&#xff1a;属性v-modelv-for 循环元素v-slotv-prev-cloak vue指令只的是带有v-前缀的特殊标签属性 插值表达式 插值表达式{…

【MATLAB第62期】基于MATLAB的PSO-NN、BBO-NN、前馈神经网络NN回归预测对比

【MATLAB第62期】基于MATLAB的PSO-NN、BBO-NN、前馈神经网络NN回归预测对比 一、数据设置 1、7输入1输出 2、103行样本 3、80个训练样本&#xff0c;23个测试样本 二、效果展示 NN训练集数据的R2为&#xff1a;0.73013 NN测试集数据的R2为&#xff1a;0.23848 NN训练集数据的…

【机器学习】Feature Engineering and Polynomial Regression

Feature Engineering and Polynomial Regression 1. 多项式特征2. 选择特征3. 缩放特征4. 复杂函数附录 首先&#xff0c;导入所需的库&#xff1a; import numpy as np import matplotlib.pyplot as plt from lab_utils_multi import zscore_normalize_features, run_gradien…

qt添加图标

1.添加资源 选择QtWidgetsApp.qrc文件打开 添加图标文件路径 添加图标文件 2.按钮添加图标 图标路径为:/res/res/swicth.jpg &#xff08;1&#xff09;代码设置图标 ui.pushButton_OPen->setIcon(QIcon(":/res/res/swicth.jpg")); &#xff08;2&#xff09;属…

设计模式:生成器模式

这个模式书上讲的比较简单&#xff0c;但是感觉精华应该是讲到了。 引用下其它博客的总结&#xff1a;生成器模式的核心在于分离构建算法和具体的构造实现&#xff0c;从而使得构建算法可以重用。 【设计模式】建造者模式_鼠晓的博客-CSDN博客

27 用linprog、fmincon求 解线性规划问题(matlab程序)

1.简述 ① linprog函数&#xff1a; 求解线性规划问题&#xff0c;求目标函数的最小值&#xff0c; [x,y] linprog(c,A,b,Aeq,beq,lb,ub) 求最大值时&#xff0c;c加上负号&#xff1a;-c ② intlinprog函数&#xff1a; 求解混合整数线性规划问题&#xff0c; [x,y] intl…

AI+低代码:开启普惠人工智能时代的新篇章

&#x1f337;&#x1f341; 博主猫头虎 带您 Go to New World.✨&#x1f341; &#x1f984; 博客首页——猫头虎的博客&#x1f390; &#x1f433;《面试题大全专栏》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33a; &a…

mac pd安装ubuntu并配置远程连接

背景 一个安静的下午&#xff0c;我又想去折腾点什么了。准备学习一下k8s的&#xff0c;但是没有服务器。把我给折腾的&#xff0c;在抱怨了&#xff1a;为什么M系列芯片的资源怎么这么少。 好在伙伴说&#xff0c;你可以尝试一下ubantu。于是&#xff0c;我只好在我的mac上安…

https协议 和 Charles 进行https抓包原理

1.对称加密 其变成复杂的加密密文发送出去。收信方收到密文后&#xff0c;若想解读原文&#xff0c;则需要使用加密用过的密钥及相同算法的逆算法对密文进行解密&#xff0c;才能使其恢复成可读明文。在对称加密算法中&#xff0c;使用的密钥只有一个&#xff0c;发收信双方都…

C++——继承(1)详解

目录 1.继承的含义 2.继承的定义&#xff1a; 3.继承方式 例子1&#xff1a;基类的访问限定符为public&#xff0c;两个派生类的继承方式分别为public、protected时&#xff1a; 例子2&#xff1a; 基类的访问限定符为protected&#xff0c;两个派生类的继承方式分别为pub…

细讲TCP三次握手四次挥手(三)

TCP/IP 协议族 在互联网使用的各种协议中最重要和最著名的就是 TCP/IP 两个协议。现在人们经常提到的 TCP/IP 并不一定是单指 TCP 和 IP 这两个具体的协议&#xff0c;而往往是表示互联网所使用的整个 TCP/IP 协议族。 互联网协议套件&#xff08;英语&#xff1a;Internet Pr…

【前端知识】React 基础巩固(四十一)——手动路由跳转、参数传递及路由配置

React 基础巩固(四十一)——手动路由跳转、参数传递及路由配置 一、实现手动跳转路由 利用 useNavigate 封装一个 withRouter&#xff08;hoc/with_router.js&#xff09; import { useNavigate } from "react-router-dom"; // 封装一个高阶组件 function withRou…

iOS--runtime

什么是Runtime runtime是由C和C、汇编实现的一套API&#xff0c;为OC语言加入了面向对象、运行时的功能运行时&#xff08;runtime&#xff09;将数据类型的确定由编译时推迟到了运行时平时编写的OC代码&#xff0c;在程序运行过程中&#xff0c;最终会转换成runtime的C语言代…

操作系统5

设备管理 I/O设备 什么是?--- 将数据Input/Output(输入/输出)计算机的外部设备。 分类: 按使用特性:人机交互类外设、存储设备、网络通信设备; 按传输速度:低速、中速、高速设备; 按信息交换的单位:块设备、字符设备。 1. 块设备和字符设备的区别? 答:块设备…

C#文件操作从入门到精通(2)——查看某个dll中有哪些函数

kernel32.dll中含有ini文件操作使用的函数&#xff0c;我们可以通过VisualStudio自带的dumpbin.exe查看dll所包含的函数&#xff0c;操作步骤如下&#xff1a; 1、找到dumpbin.exe所在的文件夹 我的电脑中安装了VisualStudio2019社区版以及VisualStudio2017Professional&…

《JeecgBoot系列》JeecgBoot(ant-design-vue)实现筛选框:支持下拉搜索+下拉多选+表字典(支持条件查询)功能

JeecgBoot(ant-design-vue)实现筛选框&#xff1a;支持下拉搜索下拉多选表字典(支持条件查询)功能 JSearchMultiSelectTag.vue源文件 一、需求介绍 在使用JeectBoot(ant-design-vue)设计表单时&#xff0c;需要实现下拉搜索下拉多选表字典(支持条件查询)。 但是系统目前有两…

【Java】零基础上手SpringBoot学习日记(day1)

前言 此帖为本人学习Springboot时的笔记&#xff0c;由于是个接触计算机一年左右的新手&#xff0c;也没有网站开发经验&#xff0c;所以有些地方的理解会比较浅显并且可能会出现错误&#xff0c;望大佬们多多包涵和指正。 Web应用开发 在我的理解中&#xff0c;Web应用的开发…