计数排序

Posted 小菜鸡y

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了计数排序相关的知识,希望对你有一定的参考价值。

数组A[N]

算法思想:

1.找出序列中最大的数Max,则序列的范围为0-k;

2.计算每个数出现的次数,用临时数组temp[Max+5]保存(遍历数组,temp[a[i]]++),注:要确保temp的长度>A的长度

3.计算<=i的元素的个数,0-Max都计算一遍

4.根据上一步可以确定<=a[i]的个数,从而将a[i]放在最终位置上

 1 void CountSort(int a[], int n,int result[])
 2 {
 3     int max=a[0];
 4     for (int i = 1; i < n; i++)   //找到最大值,确定数组中值的范围
 5     if (a[i]>max)
 6         max = a[i];
 7     int *temp = new int[max+1];
 8     for (int i = 0; i < max + 1;i++) 
 9         temp[i] = 0;
10     for (int j = 0; j < n; j++)   //此时temp[i]中存储的是元素i出现的次数
11         temp[a[j]]++;
12     for (int k = 1; k <= max; k++)
13         temp[k] += temp[k - 1];  //此时temp[i]中存储的是小于等于i的元素个数
14     for (int m = n-1; m >= 0; m--)   //从后向前遍历,因为数组a中可能存在相同的元素
15     {
16         result[temp[a[m]]-1] = a[m];     //<=m的元素有temp[a[m]]个,所以a[m]放在第temp[a[m]]位置上
17         temp[a[m]]--;          //剩下的数中,<=a[m]的元素个数减一
18     }
19     delete []temp;
20 }

时间复杂度:O(n+max)

空间复杂度:O(n+max)

以上是关于计数排序的主要内容,如果未能解决你的问题,请参考以下文章

算法-java代码实现计数排序

计数排序代码

计数排序Java代码实现

[leetcode]排序算法(冒泡排序,选择排序,插入排序,快速排序,计数排序)

计数排序再思考——从2020年1月第16题谈起

计数排序就是这么容易