鱼C论坛

 找回密码
 立即注册
查看: 4764|回复: 10

[扩展阅读] 各种各这样的排序算法:计数排序(*)

[复制链接]
发表于 2016-12-10 02:39:51 | 显示全部楼层 |阅读模式
购买主题 已有 12 人购买  本主题需向作者支付 10 鱼币 才能浏览
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-3-5 14:47:47 | 显示全部楼层
没看懂这算法什么意思
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2019-3-19 15:08:47 | 显示全部楼层
array[5] = {3, 5, 6, 5, 1}
buffer[7] = {0, 1, 0, 1, 0, 2, 1}
buffer[7] = {0, 1, 1, 2, 2, 4, 5}

i        array[i-1]        m=--buffer[array[i-1]]        sorted[m]
5        1                        0                                                sorted[0]=array[4]=1
4        5                        3                                                sorted[3]=array[3]=5
3        6                        4                                                sorted[4]=array[2]=6
2        5                        3                                                sorted[--3]=array[1]=5
1        3                        1                                                sorted[1]=array[0]=3

sorted[5] = {1, 3, 5, 5, 6}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 2 反对 0

使用道具 举报

发表于 2019-10-6 11:46:23 | 显示全部楼层
      直接遍历array[],记录元素个数存至c[],再循环输出效率会比较慢吗?
  1. #include<stdio.h>

  2. #define MAX 1024
  3. void counting_sort( int array[],int length);
  4. void counting_sort( int array[],int length)
  5. {
  6.     int t,n=0,j=0,i=0;
  7.     int c[MAX]={0};
  8.   
  9.     for( j=0;j<length;j++ )
  10.     {
  11.          t = array[j];
  12.          c[t] +=1;//直接记录array[]中某元素个数
  13.     }

  14.     while( n<length )
  15.     {
  16.         if( temp[i] != 0 )//按从小到大顺序输出array[]中元素
  17.         {
  18.             for( j=1; j<=temp[i]; j++ )
  19.             {
  20.                 printf("%d ",i);
  21.                 n += 1;
  22.             }
  23.         }
  24.         i++;
  25.     }


  26. }
  27. int main(void)
  28. {
  29.     int i,length;
  30.     int array[]={42,2,98,76,345,26,54,61,19,84};
  31.     length = sizeof(array)/sizeof(array[0]);

  32.     printf("original array is :\n");
  33.     for( i=0;i<length;i++)
  34.     {
  35.         printf("%d ",array[i]);
  36.     }
  37.     putchar('\n');

  38.     printf("after sorting is :\n");
  39.     counting_sort(array,length);
  40.     putchar('\n');

  41.     return 0;
  42. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-12-10 12:42:17 | 显示全部楼层
夏天了 发表于 2019-10-6 11:46
直接遍历array[],记录元素个数存至c[],再循环输出效率会比较慢吗?

你这里在输出的时候还是通过嵌套的循环来进行比较的啊,两层循环嵌套的话时间复杂度会比较高,而且这样也算不上计数排序了,只能说这样排序不太好,继承了计数排序的空间复杂度和比较排序的时间复杂度
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 0 反对 1

使用道具 举报

发表于 2020-2-12 22:55:40 | 显示全部楼层
全麻
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-8-25 21:40:58 | 显示全部楼层
1
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-10-23 00:36:55 | 显示全部楼层
MoukuC 发表于 2019-12-10 12:42
你这里在输出的时候还是通过嵌套的循环来进行比较的啊,两层循环嵌套的话时间复杂度会比较高,而且这样也 ...

看的我血压飙升,他算法里的循环嵌套只是把小甲鱼的两道循环整合在了一起,外层循环k次,内层共循环n次,时间效率n+k完全没变,同时算法的核心步骤buffer[array]++也没有改变,是完完全全无可置疑的计数排序。别不懂装懂误人子弟
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-3-7 22:41:18 | 显示全部楼层
人麻了,┭┮﹏┭┮
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-5-3 18:23:38 | 显示全部楼层
好好学习才能天天向上!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-7-31 22:55:47 | 显示全部楼层
没看懂我敲
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-26 01:05

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表