首页 > 其他分享 >【模版】计数排序

【模版】计数排序

时间:2023-12-20 19:44:24浏览次数:36  
标签:tmp int 模版 复杂度 计数 数组 排序

引入:P1271 【深基9.例1】选举学生会

在实际中,一般会在投票区放n个投票箱,投完后只需要计数每个投票箱即可。就此可引入计数排序。

本题AC代码(虽然这题直接sort就行了...)

#include<iostream>
using namespace std;

int a[1010]={0},n,m,tmp;
int main() {
    cin >>n>>m;
    for (int i=0;i<m;i++) {
        cin >> tmp;
        a[tmp]++; //统计数字出现的次数
    }
    
    for (int i=1;i<=n;i++)
        for (int j=0;j<a[i];j++)
            cout << i << ' ';  //输出数字,若出现次数为0则不输出
    cout << endl;
    return 0;
}

一般过程:

花O(n)的时间扫描一下整个序列 A,获取最小值 min 和最大值 max

开辟一块新的空间创建新的数组 B,长度为 ( max - min + 1)

数组 B 中 index 的元素记录的值是 A 中某元素出现的次数

最后输出目标整数序列,具体的逻辑是遍历数组 B,输出相应元素以及对应的个数

计数排序的复杂度情况:

平均时间复杂度:O(n + k)
最佳时间复杂度:O(n + k)
最差时间复杂度:O(n + k)
空间复杂度:O(n + k)

 

计数排序只能应用于值域较小的数之间的排序,因为我们需要开辟新的数组空间,如果需要排序的数字特别大,比如1e9,根本没法开这么大的数组。

 

图解如下:

 

标签:tmp,int,模版,复杂度,计数,数组,排序
From: https://www.cnblogs.com/Yukie/p/17917342.html

相关文章

  • 【模版】归并排序
    归并排序,它有两大核心操作.一个是将数组一分为二,一个无序的数组成为两个数组。另外一个操作就是,合二为一,将两个有序数组合并成为一个有序数组。时间复杂度情况:最好和最快情况都是:O(NlogN)代码模版如下intarr[N],temp[N];voidmerge_sort(intarr[],intl,intr......
  • 【模版】快速排序
    快速排序基本思想通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。算法复杂度最差时间复杂度O(N2)平均时间复杂度O(Nl......
  • 桶排序
    桶排序计数排序&基数排序思路来源一周刷爆LeetCode,算法大神左神(左程云)耗时100天打造算法与数据结构基础到笔记内容特点:不基于比较的排序算法思路计数排序申明一个定长数组,遍历数据并在对应数值的下标频率统计加一,最后根据频率数组进行输出。待排序的数据必须有范围......
  • [LeetCode] LeetCode81. 搜索旋转排序数组II
    题目描述思路:是lc33.搜索旋转排序数组的延伸,允许包含重复元素起初:当nums[left]<=nums[mid]时,区间[left,mid]有序当nums[left]>nums[mid]时,区间[mid,right]有序但是这个题目当nums[left]==nums[mid]时,无法判断哪个区间是有序的,无法判断target位于左侧还是右侧,此时无......
  • [LeetCode Hot 100] LeetCode153. 寻找旋转排序数组中的最小值
    题目描述思路如果数组翻转后又回到升序的情况,即nums[left]<=nums[right],则nums[left]就是最小值,直接返回。如果数组翻转,需要找到数组中第二部分的第一个元素:若nums[left]<=nums[mid],说明区间[left,mid]连续递增,则最小元素一定不在这个区间里,可以直接排除,最小值在[......
  • 912. 排序数组---快速排序
    1.题目介绍给你一个整数数组 \(nums\),请你将该数组升序排列。示例1:输入:nums=[5,2,3,1]输出:[1,2,3,5]示例2:输入:nums=[5,1,1,2,0,0]输出:[0,0,1,1,2,5]提示:\(1<=nums.length<=5*10^{4}\)\(-5*10^{4}<=nums[i]<=5*10^{4}\)2.题解2.1随机化快速排......
  • 详解十大经典排序算法(五):归并排序(Merge Sort)
    算法原理归并排序的核心思想是将一个大的数组分割成多个小的子数组,然后分别对这些子数组进行排序,最后将排序后的子数组合并起来,得到一个有序的大数组。算法描述归并排序(MergeSort)是一种经典的排序算法,其原理基于分治(DivideandConquer)策略。它的核心思想是将一个大问题分割成多个......
  • 详解十大经典排序算法(四):希尔排序(Shell Sort)
    算法原理希尔排序是一种基于插入排序的排序算法,也被称为缩小增量排序。它通过将待排序的序列分割成若干个子序列,对每个子序列进行插入排序,然后逐步缩小增量,最终使整个序列有序。算法描述希尔排序(ShellSort)是一种基于插入排序的算法,由DonaldShell于1959年提出。它是插入排序的一种......
  • 堆排序
    堆排序heapInsert&heapify排序思路来源一周刷爆LeetCode,算法大神左神(左程云)耗时100天打造算法与数据结构基础到笔记内容问题描述对一个数组进行大根堆排序算法思路heapInsert:视为用户一个个插入新数值,由下往上比较heapify:视为对所有子树排序,由子树的头结点从上往......
  • [LeetCode Hot 100] LeetCode33. 搜索旋转排序数组
    题目描述思路如果nums[left]<=nums[mid],则[left,mid]有序如果nums[left]>nums[mid],则[mid,right]有序方法一:classSolution{publicintsearch(int[]nums,inttarget){if(nums==null||nums.length==0)return-1;intleft=0,ri......