算法给小码农计数排序尊者

简介: 算法给小码农计数排序尊者

文章目录



排序

常见的排序算法 扩展

计数排序 不进行数据的比较,而是统计数据出现的次数

思想:计数排序又称为鸽巢原理,是对哈希直接定址法的变形应用。 操作步骤

  1. 统计相同元素出现次数
  2. 根据统计的结果将序列回收到原来的序列中

网络异常,图片无法展示
|

我们可以发现是不是很快,自我感觉一下,没错实际上的确是很快的,时间复杂度是高效到==O(N)==级别的。计数的本质是哈希,所谓的映射

这也会面临一个很现实的问题,就是前面没有时候数,后面1000的位置反而有数,咋处理

eg.1000 1100 1200 1300 1200 1400 1000 1500 1300 1200

我们也可以发现计数排序比较适合大小范围集中的数组

计数排序

// 计数排序
void CountSort(int* a, int n) {
  assert(a);
  int max = a[0], min = a[0];
  int i = 0;
  for (i = 0; i < n; i++) {
    if (a[i] > max)
      max = a[i];
    if (a[i] < min)
      min = a[i];
  }
  //范围
  int range = max - min + 1;
  //开辟计数数组
  int* count = (int*)malloc(sizeof(int) * range); 
  //没开辟成功直接错
  assert(count);
  //数组全部初始化为零
  memset(count, 0, sizeof(int) * range);
  //统计次数
  for (i = 0; i < n; i++) {
    //相对映射加加
    count[a[i] - min]++;
  }
  //通过计数数组的次数对原数组进行排序
  int j = 0;
  for (i = 0; i < range; i++) {
    while (count[i]--)
      //相对映射要回到原数组的数据+min
      a[j++] = i+min;
  }
  free(count);
  count = NULL;
}

计数排序的特性总结

  1. 计数排序在数据范围集中时,效率很高,但是适用范围及场景有限。
  2. 时间复杂度:O(MAX(N,范围))
  3. 空间复杂度:O(范围)

测性能

1000 一千

10000 一万

100000 十万

1000000 一百万

10000000 一千万


排序总结

稳定性

假定在待排序的记录序列中,存在多个具有相同的关键字的记录,若经过排序,这些记录的相对次序保持不变,即在原序列中,r[i] = r[j],且r[i] 在r[j]之前,而在排序后的序列中,r[i]仍在r[j]之前,则称这种排序算法是最稳定的,否则称为不稳定的

再简单一点:数组中相同的值,在排序以后相对位置是否变化

可能会变的,就是不稳定

能保持不变,就是稳定

八大排序总结

排序方法 平均时间复杂度 最坏时间复杂度 最好时间复杂度 空间复杂度 稳定性
插入排序 O(N^2) O(N^2) O(N) O(1) 稳定
希尔排序 O(N^1.3) O(N^2) O(N) O(1) 不稳定
选择排序 O(N^2) O(N^2) O(N^2) O(1) 不稳定
堆排序 O(n*logN) O(n*logN) O(n*logN) O(1) 不稳定
冒泡排序 O(N^2) O(N^2) O(N) O(1) 稳定
快速排序 O(n*logN) O(N^2) O(n*logN) 最好O(logN),最坏O(N) 不稳定
归并排序 O(n*logN) O(n*logN) O(n*logN) O(N) 稳定
计数排序 O(MAX(N,range)) O(MAX(N,range)) O(N) O(range) 不稳定


目录
相关文章
|
算法 搜索推荐 Python
Python算法——计数排序
Python算法——计数排序
77 0
|
1月前
|
搜索推荐 Java Go
深入了解计数排序算法
深入了解计数排序算法
34 4
|
5月前
|
算法 搜索推荐
数据结构算法--6 希尔排序和计数排序
**希尔排序**是插入排序的改进版,通过分组插入来提高效率。它逐步减少元素间的间隔(增量序列),每次对每个间隔内的元素进行插入排序,最终增量为1时进行最后一次直接插入排序,实现整体接近有序到完全有序的过程。例如,对数组`5, 7, 4, 6, 3, 1, 2, 9, 8`,先以间隔`d=4`排序,然后`d=2`,最后`d=1`,完成排序。计数排序则适用于0到100的数值,通过统计每个数出现次数,创建对应计数数组,再根据计数重建有序数组,时间复杂度为`O(n)`。
|
4月前
|
存储 算法 搜索推荐
|
11月前
|
算法 搜索推荐 大数据
【算法】排序——归并排序和计数排序
上两篇文章讲解了插入排序、选择排序以及交换排序,每种类型的排序大类下都有一到两种排序,今天给大家带来的是归并排序,和前面几种排序一样都属于比较排序中的一种,是通过比较数组中的元素来实现排序的,还给大家带来一种非比较排序计数排序,让我们开始今天的排序之吧!!!
|
5月前
|
搜索推荐 算法
【C/排序算法】:归并排序和计数排序
【C/排序算法】:归并排序和计数排序
39 0
|
6月前
|
存储 算法 前端开发
前端算法之计数排序
前端算法之计数排序
34 1
|
6月前
|
搜索推荐 C语言
【C语言/数据结构】排序(归并排序|计数排序|排序算法复杂度)
【C语言/数据结构】排序(归并排序|计数排序|排序算法复杂度)
40 0
|
6月前
|
存储 搜索推荐 算法
【数据结构】八大排序之计数排序算法
【数据结构】八大排序之计数排序算法
44 4
|
6月前
|
搜索推荐
排序算法之八:计数排序
排序算法之八:计数排序
排序算法之八:计数排序