千家信息网

Python、PHP、Java怎么实现计数排序

发表于:2026-11-02 作者:千家信息网编辑
千家信息网最后更新 2026年11月02日,这篇文章主要讲解了"Python、PHP、Java怎么实现计数排序",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"Python、PHP、Java怎么实现
千家信息网最后更新 2026年11月02日Python、PHP、Java怎么实现计数排序

这篇文章主要讲解了"Python、PHP、Java怎么实现计数排序",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"Python、PHP、Java怎么实现计数排序"吧!

计数排序(Counting sort)于1954年由 Harold H. Seward提出,通过计数将时间复杂度降到了O(N),是一种稳定的线性时间排序算法,计数排序不是一个比较排序算法。

1. 计数排序的特征

当输入的元素是 n 个 0 到 k 之间的整数时,它的运行时间是 Θ(n + k)。计数排序不是比较排序,排序的速度快于任何比较排序算法。

由于用来计数的数组C的长度取决于待排序数组中数据的范围(等于待排序数组的最大值与最小值的差加上1),这使得计数排序对于数据范围很大的数组,需要大量时间和内存。例如:计数排序是用来排序0到100之间的数字的最好的算法,但是它不适合按字母顺序排序人名。但是,计数排序可以用在基数排序中的算法来排序数据范围很大的数组。

通俗地理解,例如有 10 个年龄不同的人,统计出有 8 个人的年龄比 A 小,那 A 的年龄就排在第 9 位,用这个方法可以得到其他每个人的位置,也就排好了序。当然,年龄有重复时需要特殊处理(保证稳定性),这就是为什么最后要反向填充目标数组,以及将每个数字的统计减去 1 的原因。

算法的步骤如下:

  1. 找出待排序的数组中最大和最小的元素
  2. 统计数组中每个值为i的元素出现的次数,存入数组C的第i项
  3. 对所有的计数累加(从C中的第一个元素开始,每一项和前一项相加)
  4. 反向填充目标数组:将每个元素i放在新数组的第C(i)项,每放一个元素就将C(i)减去1

代码实现:

JavaScript

实例

function countingSort(arr, maxValue) {   var bucket = new Array(maxValue+1),       sortedIndex = 0;       arrLen = arr.length,       bucketLen = maxValue + 1;   for (var i = 0; i if (!bucket[arr[i]]) {           bucket[arr[i]] = 0;       }       bucket[arr[i]]++;   }   for (var j = 0; j while(bucket[j] > 0) {           arr[sortedIndex++] = j;           bucket[j]--;       }   }   return arr;}

Python

实例

def countingSort(arr, maxValue):   bucketLen = maxValue+1   bucket = [0]*bucketLen   sortedIndex =0   arrLen = len(arr)   for i in range(arrLen):       if not bucket[arr[i]]:           bucket[arr[i]]=0       bucket[arr[i]]+=1   for j in range(bucketLen):       while bucket[j]>0:           arr[sortedIndex] = j           sortedIndex+=1           bucket[j]-=1   return arr

Go

实例

func countingSort(arr []int, maxValue int) []int {       bucketLen := maxValue + 1       bucket := make([]int, bucketLen) // 初始为0的数组       sortedIndex := 0       length := len(arr)       for i := 0; i for j := 0; j for bucket[j] > 0 {                       arr[sortedIndex] = j                       sortedIndex += 1                       bucket[j] -= 1               }       }       return arr}

Java

实例

public class CountingSort implements IArraySort {   @Override   public int[] sort(int[] sourceArray) throws Exception {       // 对 arr 进行拷贝,不改变参数内容       int[] arr = Arrays.copyOf(sourceArray, sourceArray.length);       int maxValue = getMaxValue(arr);       return countingSort(arr, maxValue);   }   private int[] countingSort(int[] arr, int maxValue) {       int bucketLen = maxValue + 1;       int[] bucket = new int[bucketLen];       for (int value : arr) {           bucket[value]++;       }       int sortedIndex = 0;       for (int j = 0; j while (bucket[j] > 0) {               arr[sortedIndex++] = j;               bucket[j]--;           }       }       return arr;   }   private int getMaxValue(int[] arr) {       int maxValue = arr[0];       for (int value : arr) {           if (maxValue return maxValue;   }}

PHP

实例

function countingSort($arr, $maxValue = null){   if ($maxValue === null) {       $maxValue = max($arr);   }   for ($m = 0; $m $maxValue + 1; $m++) {       $bucket[] = null;   }   $arrLen = count($arr);   for ($i = 0; $i $arrLen; $i++) {       if (!array_key_exists($arr[$i], $bucket)) {           $bucket[$arr[$i]] = 0;       }       $bucket[$arr[$i]]++;   }   $sortedIndex = 0;   foreach ($bucket as $key => $len) {       if ($len !== null) $arr[$sortedIndex++] = $key;       if($len !== null){           for($j = 0; $j $len; $j++){               $arr[$sortedIndex++] = $key;           }       }   }   return $arr;}

C

实例

#include#include#includevoid print_arr(int *arr, int n) {       int i;       printf("%d", arr[0]);       for (i = 1; i printf(" %d", arr[i]);       printf("\n");}void counting_sort(int *ini_arr, int *sorted_arr, int n) {       int *count_arr = (int *) malloc(sizeof(int) * 100);       int i, j, k;       for (k = 0; k for (i = 0; i for (k = 1; k for (j = n; j > 0; j--)               sorted_arr[--count_arr[ini_arr[j - 1]]] = ini_arr[j - 1];       free(count_arr);}int main(int argc, char **argv) {       int n = 10;       int i;       int *arr = (int *) malloc(sizeof(int) * n);       int *sorted_arr = (int *) malloc(sizeof(int) * n);       srand(time(0));       for (i = 0; i printf("ini_array: ");       print_arr(arr, n);       counting_sort(arr, sorted_arr, n);       printf("sorted_array: ");       print_arr(sorted_arr, n);       free(arr);       free(sorted_arr);       return 0;}

感谢各位的阅读,以上就是"Python、PHP、Java怎么实现计数排序"的内容了,经过本文的学习后,相信大家对Python、PHP、Java怎么实现计数排序这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是,小编将为大家推送更多相关知识点的文章,欢迎关注!

排序 数组 元素 实例 算法 年龄 时间 内容 数据 范围 学习 统计 很大 最大 最小 之间 就是 数字 目标 复杂 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 互联网科技工作委员会毛军 互联网科技与金融科技 金融科技 互联网金融 华宇互联网科技 互联网与未来科技 唐信互联网科技 深圳天众互联网科技公司 碳银互联网科技有限公司 互联网养老 桔豆科技 居家互联网科技有限公司 互联网和高科技公司 汽车互联网创新科技园 现代互联网科技股 中化能源互联网科技招聘 本届互联网博览会上的黑科技 华夏恒生科技与互联网科技 长沙茂晟互联网科技有限公司 伍佰万互联网科技怎么赚钱 盐城市攀科互联网科技有限公司 株洲百竞科技的互联网营销顾问 深圳市人人互联网科技有限公司 互联网科技公司经营范围 关于新基建和互联网科技 互联网金融和金融科技 雨阳互联网卡科技有限公司 广东鹅鹅鹅互联网科技有限公司 中国新注册互联网科技 福仕德教育科技互联网 前海云享互联网科技 广州全民伙伴互联网科技有限公司
0