c语言复杂度为o(n)的排序算法,计数排序算法——时间复杂度O(n+k)

计数排序

计数排序是一个非基于比较的排序算法,该算法于1954年由 Harold H. Seward 提出。它的优势在于在对一定范围内的整数排序时,它的复杂度为Ο(n+k)(其中k是整数的范围),快于任何比较排序算法。

算法思想

计数排序对输入的数据有附加的限制条件:

1、输入的线性表的元素属于有限偏序集S;

2、设输入的线性表的长度为n,|S|=k(表示集合S中元素的总数目为k),则k=O(n)。

在这两个条件下,计数排序的复杂性为O(n)。

计数排序的基本思想是对于给定的输入序列中的每一个元素x,确定该序列中值小于x的元素的个数。一旦有了这个信息,就可以将x直接存放到最终的输出序列的正确位置上。例如,如果输入序列中只有17个元素的值小于x的值,则x可以直接存放在输出序列的第18个位置上。当然,如果有多个元素具有相同的值时,我们不能将这些元素放在输出序列的同一个位置上,因此,上述方案还要作适当的修改。

假设输入的线性表L的长度为n,L=L1,L2,..,Ln;线性表的元素属于有限偏序集S,|S|=k且k=O(n),S={S1,S2,..Sk};则计数排序可以描述如下:

1、扫描整个集合S,对每一个Si∈S,找到在线性表L中小于等于Si的元素的个数T(Si);

2、扫描整个线性表L,对L中的每一个元素Li,将Li放在输出线性表的第T(Li)个位置上,并将T(Li)减1。

Java版语言描述:

package sort;

public class Main {

public static void main(String[] args) {

// 排序的数组

int a[] = { 99, 93, 97, 92, 96 };

int b[] = countSort(a);

for (int i : b) {

System.out.print(i + " ");

}

System.out.println();

}

public static int[] countSort(int[] a) {

int b[] = new int[a.length];

int max = a[0];//数组a中的最大值

int min = a[0];//数组a中的最小值

for (int i : a) {

if (i > max) {

max = i;

}

if (i < min) {

min = i;

}

}

int k = max - min + 1; // 这里k的大小是要排序的数组中,元素大小的极值差+1

int c[] = new int[k]; //此时c[]中的每个元素全是零

for (int i = 0; i < a.length; ++i) {

c[a[i] - min] += 1; // 数组c下标对应“数组a元素值与数组a最小值的差”,改下标的数组c元素值置1

// 优化过的地方,减小了数组c的大小

}

for (int i = 1; i < c.length; ++i) {

c[i] = c[i] + c[i - 1]; //小技巧:数组c的值置成顺序值

}

for (int i = a.length - 1; i >= 0; --i) {

int temp = c[a[i] - min] - 1;

b[temp] = a[i];// 按存取的方式取出c的元素

}

return b;

}

}

十大排序算法时间复杂度 All In One

十大排序算法时间复杂度 All In One 排序算法时间复杂度 排序算法对比 Big O O(n) O(n*log(n)) O(n^2) 冒泡排序 选择排序 插入排序 快速排序 归并排序 基数排序 ...

新发现:排序算法时间复杂度只有O&lpar;3n&rpar;,命名为&quot&semi;wgw&quot&semi;排序法

思路:首先在待排序数组i[]中找出最大的值,以(最大值+1)的大小创建一个空数组kk[],然后遍历待排序数组i[]中的值n,其值n对应数组kk[]中的第n个元素加1.最后再把数组kk[]排好序的值赋回 ...

python实现排序算法 时间复杂度、稳定性分析 冒泡排序、选择排序、插入排序、希尔排序

说到排序算法,就不得不提时间复杂度和稳定性! 其实一直对稳定性不是很理解,今天研究python实现排序算法的时候突然有了新的体会,一定要记录下来 稳定性: 稳定性指的是 当排序碰到两个相等数的时候,他 ...

数据结构中常用的排序算法 &amp&semi;&amp&semi; 时间复杂度 &amp&semi;&amp&semi; 空间复杂度

第一部分:数据结构中常用的排序算法 数据结构中的排序算法一般包括冒泡排序.选择排序.插入排序.归并排序和 快速排序, 当然还有很多其他的排序方式,这里主要介绍这五种排序方式. 排序是数据结构中的主要内 ...

几种排序算法的学习,利用Python和C实现

之前学过的都忘了,也没好好做过总结,现在总结一下. 时间复杂度和空间复杂度的概念: 1.空间复杂度:是程序运行所以需要的额外消耗存储空间,一般的递归算法就要有o(n)的空间复杂度了,简单说就是递归集算 ...

排序算法的C语言实现&lpar;下 线性时间排序:计数排序与基数排序&rpar;

计数排序 计数排序是一种高效的线性排序. 它通过计算一个集合中元素出现的次数来确定集合如何排序.不同于插入排序.快速排序等基于元素比较的排序,计数排序是不需要进行元素比较的,而且它的运行效率要比效率为 ...

JavaScript 数据结构与算法之美 - 桶排序、计数排序、基数排序

1. 前言 算法为王. 想学好前端,先练好内功,只有内功深厚者,前端之路才会走得更远. 笔者写的 JavaScript 数据结构与算法之美 系列用的语言是 JavaScript ,旨在入门数据结构与算 ...

排序算法的c&plus;&plus;实现——计数排序

任何比较排序算法的时间复杂度的上限为O(NlogN), 不存在比o(nlgN)更少的比较排序算法.如果想要在时间复杂度上超过O(NlogN)的时间复杂度,肯定需要加入其它条件.计数排序就加入了限制条件 ...

排序算法Java版,以及各自的复杂度,以及由堆排序产生的top K问题

常用的排序算法包括: 冒泡排序:每次在无序队列里将相邻两个数依次进行比较,将小数调换到前面, 逐次比较,直至将最大的数移到最后.最将剩下的N-1个数继续比较,将次大数移至倒数第二.依此规律,直至比较结 ...

随机推荐

Questa Functional Verification-autocheck

1.AutoCheck analysis introduce Autocheck是自动对RTL代码使用形式验证进行规则检查的检查器,是Questa Verify tools的一部分.Autochenc ...

JavaWeb chapter11 编写无脚本的JSP页面

1.  JSP表达式语言EL 使用jsp:getProperty的property属性只能访问Bean的属性,不能访问嵌套的属性. JSP EL(表达式语言 Expression Language), ...

C&num;常用的正则表达式

using System.Text.RegularExpressions; 英文Regex.IsMatch("字符串", @"^[a-zA-Z0-9_\u4e00-\u9 ...

Java根据html模板创建 html文件

1.创建html的java代码 package com.tydic.eshop.util; import java.io.FileInputStream; import java.io.FileOut ...

LeetCode&colon; MergekSortedLists

Title: Merge k sorted linked lists and return it as one sorted list. Analyze and describe its comple ...

向MapReduce转换:生成用户向量

分两部分: /*** * @author YangXin * @date 2016/2/21 * @ inf ...

JS判断图片是否加载完成 背景图404 快到碗里来

面对这个问题 我最多做到表面笑嘻嘻 …… 真不知道测试怎么那么…… 啥都能给你测出来 有的没的都能给你测出来 算了算了  谁让本仙女本精灵本可爱温柔大方善解人意呢 …呵呵呵 ————————————正 ...

&lbrack;AH2017&sol;HNOI2017&rsqb;礼物&lpar;FFT&rpar;

题目描述 我的室友最近喜欢上了一个可爱的小女生.马上就要到她的生日了,他决定买一对情侣手 环,一个留给自己,一 个送给她.每个手环上各有 n 个装饰物,并且每个装饰物都有一定的亮度.但是在她生日的前一 ...

MySQL数据库基本用法-聚合-分组

聚合 为了快速得到统计数据,提供了5个聚合函数 count(*)表示计算总行数,括号中写星与列名,结果是相同的 查询学生总数 select count(*) from students; max(列) ...

Delphi操作剪贴板

Windows使用剪贴板观察器和观察链.剪贴板观察器是一个显示剪贴板当前内容的窗口.            通常它应该至少能显示三种普通格式的内容:文字CF_TEXT.位图CF_BITMAP.元文件C ...

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值