计数排序是一种稳定的排序算法,它不是比较排序。计数排序是有条件限制的:排序的数必须是n个0到k的数,所以计数排序不适合给字母排序。计数排序时间复杂度:O(n+k),空间复杂度:O(k),当k=n时,时间复杂度可以达到O(n)。

计数排序思想:给定一个符合规定的无序数组,先求出这个数组中最大的数,然后开辟一个辅助数组,将无序数组中的数对应到辅助数组中,并计算出每个数出现的次数。再继续从辅助数组中得出到了每个位置,需要排序的数组中的数出现了几次,然后对应的将无序的数组赋值给另一个数组。

排序过程:

A:2  5  3  0  2  3  0  3              c:2  0  2  3  0  1

位置:0  1  2  3  4  5  6  7           位置:0  1  2  3  4  5

c:2  2  4  7  7  8

位置:0  1  2  3  4  5

b:                  3                  c:2  2  4  6  7  8

位置:0  1  2  3  4  5  6  7            位置:0  1  2  3  4  5

b:   0              3                    c:1  2  4  6  7  8

位置:0  1  2  3  4  5  6  7              位置:0  1  2  3  4  5

b:   0           3  3                    c:1  2  4  5  7  8

位置:0  1  2  3  4  5  6  7              位置:0  1  2  3  4  5

b:0  0  2  2  3  3  3  5

位置:0  1  2  3  4  5  6  7

示例代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void CountingSort(int arrayA[], int arrayB[], int n) //进行计数排序
{
int max = ;
for(int i = ; i<n; i++) //找出数组中最大的数
{
if(arrayA[i]>max)
max = arrayA[i];
}
int * arrayC = (int *)malloc(sizeof(int)*(max+)); //开辟一个数组空间,用来存储各个数出现的次数
memset(arrayC, , sizeof(int)*(max+)); //将开辟的数组进行初始化为0
for(int i = ; i<n; i++) //计算各个数出现的次数
arrayC[arrayA[i]]++;
for(int i = ; i<=max; i++) //进行次数的累加,以知道到了那个数,出现了几个要排序的数
arrayC[i] += arrayC[i-];
for(int i = n-; i>=; i--) //从高位到低位排序,保证了稳定性
{
arrayB[arrayC[arrayA[i]]-] = arrayA[i];
arrayC[arrayA[i]]--;
}
free(arrayC); //释放内存
}
int main()
{
int n;
int arrayA[], arrayB[];
printf("请输入要排序数组的大小:");
scanf("%d", &n);
printf("请输入数组中各个数:" );
for(int i = ; i<n; i++)
scanf("%d", &arrayA[i]);
CountingSort(arrayA, arrayB, n);
for(int i = ; i<n; i++)
printf("%d ", arrayB[i]);
}

计数排序(counting-sort)的更多相关文章

  1. 《算法导论》——计数排序Counting Sort

    今天贴出的算法是计数排序Counting Sort.在经过一番挣扎之前,我很纠结,今天这个算法在一些scenarios,并不是最优的算法.最坏情况和最好情况下,时间复杂度差距很大. 代码Countin ...

  2. 计数排序/Counting Sort

    计数排序的算法思想: 对于每一个元素x,只要确定了元素x有多少个比它小的元素,那么就可以知道其最终的位置. 记输入数组为A[n],存放最后排序输出的数组为B[n],提供临时存储空间的中间数组记为C[k ...

  3. 计数排序Counting sort

    注意与基数排序区分,这是两个不同的排序 计数排序的过程类似小学选班干部的过程,如某某人10票,作者9票,那某某人是班长,作者是副班长 大体分两部分,第一部分是拉选票和投票,第二部分是根据你的票数入桶 ...

  4. 十大经典排序算法+sort排序

    本文转自:十大经典排序算法,其中有动图+代码详解,本文简单介绍+个人理解. 排序算法 经典的算法问题,也是面试过程中经常被问到的问题.排序算法简单分类如下: 这些排序算法的时间复杂度等参数如下: 其中 ...

  5. counting sort 计数排序

    //counting sort 计数排序 //参考算法导论8.2节 #include<cstdio> #include<cstring> #include<algorit ...

  6. 排序算法六:计数排序(Counting sort)

    前面介绍的几种排序算法,都是基于不同位置的元素比较,算法平均时间复杂度理论最好值是θ(nlgn). 今天介绍一种新的排序算法,计数排序(Counting sort),计数排序是一个非基于比较的线性时间 ...

  7. 【算法】计数排序(Counting Sort)(八)

    计数排序(Counting Sort) 计数排序不是基于比较的排序算法,其核心在于将输入的数据值转化为键存储在额外开辟的数组空间中. 作为一种线性时间复杂度的排序,计数排序要求输入的数据必须是有确定范 ...

  8. 【算法导论】【排序】—— 计数排序(counting sort)

    计数排序的特点: 需要额外的数组以存储: 中间过程数据(记为数组 C),数组 C 的下标是待排序序列的元素值,下标对应的值为出现的次数: 排序后的序列(记为 B),计数排序仅获取原始待排序序列的值,对 ...

  9. 数据结构与算法-排序(八)计数排序(Counting Sort)

    摘要 计数排序本质就是统计不同元素出现的次数,然后将元素依次从小到大放置,每个元素看统计的次数,就紧挨着放置几个同样的元素. 看似简单的处理,在算法中,会依据统计的元素次数推算出每个元素的索引位置,这 ...

  10. 计数排序与桶排序(bucket sort)

    Bucket Sort is a sorting method that subdivides the given data into various buckets depending on cer ...

随机推荐

  1. Pyhton学习——Day34

    # 任何语言都会发生多线程,会出现不同步的问题,同步锁.死锁.递归锁# 异步: 多任务, 多个任务之间执行没有先后顺序,可以同时运行,执行的先后顺序不会有什么影响,存在的多条运行主线# 同步: 多任务 ...

  2. .Net调用Java编写的WebServices返回值为Null的解决方法(SoapUI工具测试有返回值)

    最近在项目中与别的公司对接业务,对方是Java语言,需要调用对方的WebServices,结果常规的添加web引用的方法可以传过去值,但是返回值为null 查了很多资料,没有解决方法 思考应该是.Ne ...

  3. 洛谷4623 [COCI2012-2013#6] BUREK

    题目描述 给定N个三角形,和M条直线,直线要么平行于X轴,要么平行于Y轴,问这M条直线 分别经过多少个三角形内部 (注意是内部即分开的两个多边形的面积均大于零). 输入输出格式 输入格式: 第一行一个 ...

  4. BlankUtil(判断是否为空和去除多余空格)

    package com.drn.core.util; import java.io.Serializable; import java.util.Map; import java.util.Prope ...

  5. java中 flush()方法的作用

    flush() 是清空,而不是刷新啊.一般主要用在IO中,即清空缓冲区数据,就是说你用读写流的时候,其实数据是先被读到了内存中,然后用数据写到文件中,当你数据读完的时候不代表你的数据已经写完了,因为还 ...

  6. java源码之Comparable和Comparator

    1,Comparable 简介 Comparable 是排序接口. 若一个类实现了Comparable接口,就意味着“该类支持排序”.  即然实现Comparable接口的类支持排序,假设现在存在“实 ...

  7. Collection、List、Set、Map之间的关系

    初学java,单个的接触有点迷糊,所以总结下他们的关系 一.关系 Collection --List:以特定顺序存储 --ArrayList.LinkList.Vector --Set:不能包含重复的 ...

  8. JSON数据的生成与解析

    JSON数据的生成与解析.首先先到网上下载一个json jar包,我用的是org.json 演示样例代码: package json; import org.json.JSONArray; impor ...

  9. cocos2d-x3.2 下使用多线程

    事实上在cocos2dx下使用多线程事实上就是用C++去写,这里提供几个简单的样例: 原文地址:http://blog.csdn.net/qqmcy/article/details/36227377 ...

  10. app-framework学习--nav的Scroller禁用与启用

    app-framewor(jqmobi) nav的Scroller禁用与启用 写在panel 的 data-load 方法里 禁用  $.ui.scrollingDivs.menu_scroller. ...