| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1660 人关注过本帖
标题:一种计数排序算法的实现 C语言
只看楼主 加入收藏
烈烈水云天
Rank: 2
来 自:湖南
等 级:论坛游民
帖 子:56
专家分:33
注 册:2009-12-30
结帖率:100%
收藏
 问题点数:0 回复次数:3 
一种计数排序算法的实现 C语言
#include <stdio.h>
int array[10] = {10, 25, 13, 13, 6, 12, 28, 15, 10, 22};
void counting_sort(int result[], int position[], int len, int max);
int main(int argc, char **argv)
{
        int i = 0;
        int result[10] = {0};
        int position[30] = {0};
       counting_sort(result, position, 10, 30);
        for(i = 0; i < 10; i++)
{
         printf("%d ", result[i]);
        }
        printf("\n");
        return 0;
}
void counting_sort(int result[], int position[], int len, int max)
{
        int i = 0;
        for(i = 0; i < len; i++)
{
        position[array[i]] += 1;
        }
        for(i = 1; i < max; i++)
{
        position[i] += position[i-1];
        }
        for(i = 0; i < len; i++)
{
        result[position[array[i]]-1] = array[i];
         position[array[i]]--;
        }
}
搜索更多相关主题的帖子: 算法 C语言 计数 
2010-01-08 17:57
BlueGuy
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:29
帖 子:4476
专家分:4055
注 册:2009-4-18
收藏
得分:0 
请问你的头像 跟你本人有几分相似?

我就是真命天子,顺我者生,逆我者死!
2010-01-08 18:01
BlueGuy
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:29
帖 子:4476
专家分:4055
注 册:2009-4-18
收藏
得分:0 
#include <stdio.h>
#define M 5
#define maxN 15
void distcount(int a[], int left, int right)
{
    int cnt
, b[maxN]; //cnt-> 计数器数组  b[maxN] -> 辅助数组
int i, j;
    for (j = 0; j <  M; j++)
  cnt[j] = 0;    // 将计数初始化为 0
    for (i = left; i <= right; i++)
  cnt[a+1]++; // 将二个计数器设置成 0 的个数, 第三个计数器设置成 1 的个数,   
                    // cnt[0]未用 因为小于 0 的键必定是 0 个
    for (j = 1; j <  M; j++)
  cnt[j] += cnt[j-1];         // 相加得到小于 或 等于 计数对应值键数量
     
for (i = left; i <= right; i++) // 根据这些索引将键移动到辅助数组 b 中
  b[cnt[a]++] = a;

for (i = left; i <= right; i++)
  a = b;
}
int main(void)
{
int a[15] = {0,3,3,0,1,1,0,3,0,2,0,1,1,2,0};
    int i;
distcount(a, 0, 14);

for (i = 0; i <= 14; i++)
  printf("%d ", a);
printf("\n");
return 0;
}

改进版本:
//DistributionCounting 分布计数
int main()
{
    int a[7] = {13,11,12,13,12,12,18};
    int d[8], s[7];
int i, j;
for (j = 0; j <= 7; j++)
  d[j] = 0;
for (i = 0; i < 7; i++)    // 18 - 11 = 7
  d[a-11]++;
    for(i = 0; i <= 7; i++)
  printf("%d ", d);   
printf("\n");
for (j = 1; j <= 7; j++)  // j = 1
  d[j] = d[j-1] + d[j];
for(i = 0; i <= 7; i++)
  printf("%d ", d);
printf("\n");
for (i = 6; i >= 0; i--)
{
  j = a-11;
  s[d[j]-1] = a;
  d[j] = d[j] - 1;
}
for(i = 0; i < 7; i++)
  printf("%d ",s);
printf("\n");
return 0;
}

#include <stdio.h>
#define M 5              // 键必须为小于 M 的整数     
void distcount(int a[], int left, int right)
{
    int cnt[m], b[15]; //cnt[m] -> 计数器数组  b[15] -> 辅助数组
int i, j;
    for (j = 0; j <  M; j++)
  cnt[j] = 0;     // 将计数初始化为 0
    for (i = left; i <= right; i++)
  cnt[a+1]++;  // 将二个计数器设置成 0 的个数, 第三个计数器设置成 1 的个数: 6个0, 4个1...
                     // cnt[0]未用 因为小于 0 的键必定是 0 个
    for (j = 1; j <  M; j++)
  cnt[j] += cnt[j-1];           // 相加得到小于 或 等于 计数对应值键数量: 小于0的0个, 小于1的6个...
   
for (i = left; i <= right; i++)   // 根据这些索引将键移动到辅助数组 b 中
  b[cnt[a]++] = a;        //cnt[a]++  增加对应键的指针 使其指向下一个要到的位置
                                      //cnt[a]++ 是从左往右放值
                                   //也可以从右往左放值: --cnt[a+1]

for (i = left; i <= right; i++)   //将排序后的文件移回数组到 a 中
  a = b;
}
int main(void)
{
int a[15] = {0,3,3,0,1,1,0,3,0,2,0,1,1,2,0};
    int i;
distcount(a, 0, 14);

for (i = 0; i <= 14; i++)
  printf("%d ", a);
printf("\n");
return 0;
}

我就是真命天子,顺我者生,逆我者死!
2010-01-08 18:04
树上月
Rank: 3Rank: 3
等 级:论坛游侠
威 望:1
帖 子:114
专家分:154
注 册:2010-1-6
收藏
得分:0 
回复 2楼 BlueGuy
呵呵。。。

每一个不曾起舞的日子,都是对未来的一种辜负......
2010-01-09 18:19
快速回复:一种计数排序算法的实现 C语言
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.016519 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved