优化输入输出后的计数排序

当数据太大,内存要求紧,整数范围小时,存在不能用快排的情况,这时可用计数排序。

#include<cstdio>
#include<cstring>
#include<cctype>
inline int readint(){
    char c=getchar();
    while(!isdigit(c)) c=getchar();
    int x=0;
    while(isdigit(c)) {
    x=x*10+c-'0';
    c=getchar();
    }
    return x;
}
int buf[10];
inline void writeint(int i){
    int p=0;
    if(i==0) p++;
    else while(i){
            buf[p++]=i%10;
    i/=10;
    }
    for(int j=p-1;j>=0;j--) putchar('0'+buf[j]);
}
int main()
{
    int n,x,c[101];
    while(n=readint()){
            memset(c,0,sizeof(c));
    for(int i=0;i<n;i++) c[readint()]++;
    int first=1;
    for(int i=1;i<=100;i++)
    for(int j=0;j<c[i];j++){
            if(!first) putchar(' ');
    first=0;
    writeint(i);
    }
    putchar('\n');
    }
    return 0;
}
时间: 2024-07-30 20:00:06

优化输入输出后的计数排序的相关文章

计数排序 + 线段树优化 --- Codeforces 558E : A Simple Task

E. A Simple Task Problem's Link: http://codeforces.com/problemset/problem/558/E Mean: 给定一个字符串,有q次操作,每次操作将(l,r)内的字符升序或降序排列,输出q次操作后的字符串. analyse: 基本思想是计数排序. 所谓计数排序,是对一个元素分布较集中的数字集群进行排序的算法,时间复杂度为O(n),但使用条件很苛刻.首先对n个数扫一遍,映射出每个数字出现的次数,然后再O(n)扫一遍处理出:对于数字ai,

【数据结构】非比较排序算法(实现计数排序和基数排序)

● 计数排序 1.算法思想: 计数排序是直接定址法的变形.通过开辟一定大小的空间,统计相同数据出现的次数,然后回写到原序列中. 2.步骤: 1)找到序列中的最大和最小数据,确定开辟的空间大小. 2)开辟空间,利用开辟的空间存放各数据的个数. 3)将排好序的序列回写到原序列中. 具体实现如下: void CountSort(int *arr, int size) {  assert(arr);  int min = arr[0];  int max = arr[0];  int num = 0;

计数排序及其扩展思路

(1)原理和代码以及时间复杂度分析 1.计数排序的原理:设被排序的数组为A,排序后存储到B,C为临时数组.所谓计数,首先是通过一个数组C[i]计算大小等于i的元素个数,此过程只需要一次循环遍历就可以:在此基础上,计算小于或者等于i的元素个数,也是一重循环就完成.下一步是关键:逆序循环,从length[A]到1,将A[i]放到B中第C[A[i]]个位置上.原理是:C[A[i]]表示小于等于a[i]的元素个数,正好是A[i]排序后应该在的位置.而且从length[A]到1逆序循环,可以保证相同元素间

大话桶排序 基数排序和计数排序

一:计数排序 (1)当输入的元素是 n 个 0 到 k 之间的整数时,它的运行时间是 Θ(n + k).计数排序不是比较排序,排序的速度快于任何比较排序算法.由于用来计数的数组C的长度取决于待排序数组中数据的范围(等于待排序数组的最大值与最小值的差加上1),这使得计数排序对于数据范围很大的数组,需要大量时间和内存.例如:计数排序是用来排序0到100之间的数字的最好的算法,但是它不适合按字母顺序排序人名.但是,计数排序可以用在基数排序中的算法来排序数据范围很大的数组. (2)算法的步骤如下: 1.

冒泡排序,快速排序,归并排序,插入排序,希尔排序,堆排序,计数排序,桶排序,基数排序

选择排序,冒泡排序,快速排序,归并排序,插入排序,希尔排序,计数排序,桶排序,基数排序 以上是一些常用的排序算法. 选择排序 for(int i = 0; i < n; i++) { int minval = a[i]; int minid = i; for (int j = i+1; j < n; j++) { if (a[j] < minval) { minid = j; minval = a[j]; } } swap(a[i], a[minid]); } 最简单的就是选择排序,就是

【算法】计数排序、桶排序和基数排序详解

01.计数排序.桶排序与基数排序 并不是所有的排序 都是基于比较的,计数排序和基数排序就不是.基于比较排序的排序方法,其复杂度无法突破\(n\log{n}\) 的下限,但是 计数排序 桶排序 和基数排序是分布排序,他们是可以突破这个下限达到O(n)的的复杂度的. 1. 计数排序 概念 计数排序是一种稳定的线性时间排序算法.计数排序使用一个额外的数组C,使用 C[i] 来计算 i 出现的次数.然后根据数C来将原数组A中的元素排到正确的位置. 复杂度 计数排序的最坏时间复杂度.最好时间复杂度.平均时

Java实现堆排序和计数排序

堆排序代码: import java.util.Arrays; /** * 思路:首先要知道大顶堆和小顶堆,数组就是一个堆,每个i节点的左右孩子是2i+1和2i+2 * 有了堆,将其堆化:从(n/2)-1个元素开始向下修复,将每个节点修复为小(大)顶堆 * 修复完成后,数组具有小(大)顶堆的性质 * 按序输出:小顶堆可以对数组逆序排序,每次交换堆顶和末尾元素,对堆顶进行向下修复,这样次小元素又到堆顶了 * * 时间复杂度:堆化:一半的元素修复,修复是单分支的,所以整体堆化为nlgn/2 * 排序

什么是计数排序?

有这样一道排序题:数组里有20个随机数,取值范围为从0到10,要求用最快的速度把这20个整数从小到大进行排序. 第一时间你可能会想使用快速排序,因为快排的时间复杂度只有O(nlogn).但是这种方法还是不够快,有没有比O(nlogn)更快的排序方法呢?你可能会有疑问:O(nlogn)已经是最快的排序算法了,怎么可能还有更快的排序方法? 让我们先来回顾一下经典的排序算法,无论是归并排序,冒泡排序还是快速排序等等,都是基于元素之间的比较来进行排序的.但是有一种特殊的排序算法叫计数排序,这种排序算法不

一文弄懂计数排序算法!

这是小川的第385次更新,第413篇原创 01 计数排序算法概念 计数排序不是一个比较排序算法,该算法于1954年由 Harold H. Seward提出,通过计数将时间复杂度降到了O(N). 02 基础版算法步骤 第一步:找出原数组中元素值最大的,记为max. 第二步:创建一个新数组count,其长度是max加1,其元素默认值都为0. 第三步:遍历原数组中的元素,以原数组中的元素作为count数组的索引,以原数组中的元素出现次数作为count数组的元素值. 第四步:创建结果数组result,起