算法导论之八计数排序

1.        定理1:在最坏情况下,任何比较排序算法都需要做

定理2:堆排序和归并排序都是渐近最优的比较排序算法。

2.        计数排序的思想是:对每一个输入元素x,确定小于x的个数,前提条件时假设n个输入元素中的每一个都是在0到k区间内的一个整数。

3.        计数排序算法的输入是数组A[1..n],Alength=n,数组B[1..n]存放排序的输出,C[0..k]提供临时存储空间

COUNT-SORT(A,B,k)

         //初始化操作

         let C[0..k]be a new array

         for i = 0 tok

                   C[i]= 0

         //C[i]中保存的是等于i的元素的个数

         for j = 1 toA.length

                   C[A[j]]= C[A[j]] + 1

         //通过相加,确定对每一个i=0,…,k,有多少输入元素是小于等于i的

         for i = 1 tok

                   C[i]= C[i] + C[i-1]

         for j =A.length downto 1

                   B[C[A[j]]]= A[j]

                   C[A[j]]= C[A[j]] – 1

最后将每个元素A[j]放到它在输出数组B中的正确位置。如果n个元素互异,对每一个A[j]值来说,C[A[j]]就是A[j]在输出数组中的最终正确位置,因为所有的元素可能并不互异,所以每将一个值A[j]放入数组B中以后,都要讲C[A[j]]的值减1.这样当下一个值等于A[j]的输入元素时,该元素可直接放到输出数组A[j]的前一个位置上。

4.        当k为O(n)时,计数排序的运行时间为 ,计数排序的重要性质就是它是稳定的,即具有相同值得元素在输出数组中的相对次序与它们在输入数组中的相对次序相同。

5.        计数排序的程序代码如下:

#include<stdio.h>

#include<stdlib.h>

 

intCountSort(int *pData,int nLen)

{

         int *pCount=NULL;  //保存记录数据的指针

         pCount=(int*)malloc(sizeof(int)*nLen);  //申请保存的空间

 

         //初始化计数为0

         for (int i=0;i<nLen;i++)

         {

                   pCount[i]=0;

         }

 

         //统计数组中相同元素的个数

         for (int i=0;i<nLen;i++)

         {

                   pCount[pData[i]]++;

         }

 

         //确定不比该位置大的数据个数

         for (int i=1;i<nLen;i++)

         {

                   pCount[i]+=pCount[i-1];

         }

 

         int *pSort=NULL;     //保存排序结果的指针

         pSort=(int *)malloc(sizeof(int)*nLen);

 

         for (int i=nLen-1;i>=0;i--)

         {

                   pSort[pCount[pData[i]]-1]=pData[i];

                   --pCount[pData[i]];

         }

 

         for (int i=0;i<nLen;i++)

         {

                   pData[i]=pSort[i];

         }

 

         free(pCount);

         free(pSort);

         return 1;

}

intmain()

{

         int nData[]={8,6,3,6,5,8,3,5,1,0};

         CountSort(nData,10);

         for (int i=0;i<10;i++)

         {

                   printf("%d",nData[i]);

         }

         printf("\n");

         return 0;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

mengrennwpu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值