计数排序及优化

简介: 计数排序及优化

 



计数排序

基本思想:

计数排序与其他排序不同,它没有数据的比较;

基本思想是:计数+排序

计数:

先开一个大小为range(大小后面有讲)的数组tmp,遍历一遍待排序的数据,遍历到某个数据(如5)时,就在tmp数组中下标为5的位置上+1,遍历完待排数据,就计数完成;

排序:

计数完,只需要根据tmp数组,数据就是tmp组的下标,有多少个就是对应下标上的数据,例如

tmp[5]=3;即数据为5的有3个

图解:

 

优化

为了避免空间的浪费,range的大小为待排数据打最大值减去最小值加1;

range=max-min+1;

例如:如果数据最小值为100,最大值为199,如果用上面的思想,就需要开辟空间为200个int数组,但是前面100个数组位置没有存储数据,就造成了空间浪费,这种情况就需要开100个int空间的数组,数组下标0的位置计数100的出现的次数,当排序时只需要相应的加上100(min)即可;

实现代码:

void CountSort(int* a,int n )
{
    //找出最大最小值
  int min = a[0], max = a[0];
  for (int 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);
  if (count == NULL)
  {
    perror("malloc fail");
    return;
  }
    //将开辟数组初始化为0
  memset(count, 0, sizeof(int) * range);
  //计数
  for (int i = 0; i < n; i++)
  {
    count[a[i]-min]++;
  }
  //排序
  int i = 0;
  for (int j = 0; j < range; j++)
  {
    while (count[j]--)
    {
      a[i++] = j + min;
    }
  }
}

性能分析:

时间复杂度:O(N+range)

空间复杂度:O(range)

稳定性:不稳定

目录
相关文章
|
搜索推荐 算法 索引
冒泡排序算法的实现和优化~
冒泡排序算法的实现和优化~
|
1月前
|
搜索推荐 Java Go
深入了解计数排序算法
深入了解计数排序算法
34 4
|
搜索推荐 算法
|
4月前
|
存储 算法 搜索推荐
|
11月前
|
算法 搜索推荐 大数据
【算法】排序——归并排序和计数排序
上两篇文章讲解了插入排序、选择排序以及交换排序,每种类型的排序大类下都有一到两种排序,今天给大家带来的是归并排序,和前面几种排序一样都属于比较排序中的一种,是通过比较数组中的元素来实现排序的,还给大家带来一种非比较排序计数排序,让我们开始今天的排序之吧!!!
|
6月前
|
搜索推荐
【hoare优化版】快速排序算法 | 三数取中&小区间优化(2)
【hoare优化版】快速排序算法 | 三数取中&小区间优化(2)
81 0
|
6月前
|
算法 搜索推荐 Java
数据结构与算法面试:基于比较的排序算法时间复杂度最坏情况下是 O(nlogn),请问有没有更快的算法?(提示:计数排序、基数排序)
数据结构与算法面试:基于比较的排序算法时间复杂度最坏情况下是 O(nlogn),请问有没有更快的算法?(提示:计数排序、基数排序)
48 0
|
6月前
|
存储 搜索推荐
常见排序算法原理——第三部分(桶排序、计数排序、基数排序)
常见排序算法原理——第三部分(桶排序、计数排序、基数排序)
|
存储 搜索推荐 C#
C#计数排序算法
C#计数排序算法
|
机器学习/深度学习 人工智能 算法
快速排序的实现和优化~
快速排序的实现和优化~