计数排序-CountingSort

今天看到了算法导论里面的计数排序,灰常的兴奋啊~~~这是我知道的第一个非比较排序,本人菜鸟,所以大牛们很可能对我这种兴奋嗤之以鼻啊,嘿嘿。看书上伪码的时候,在草纸上比比划划了半天,才算把数组之间的关系弄清楚,回来后自己用c++尝试着实现了一下,总算是实现出来了。代码可能写的很不尽人意,欢迎大 家指教。^^

#include<iostream>
using namespace std;

//k为Input数组中的最大数,同时也是数组C的大小
void Counting_Sort(int Input[],int* Output,int len,int k)
{
 
    int *C=new int[k];
      //初始化数组C
      for(int m=0;m<k;m++)
            C[m]=0;

      //数组C的下标对应着Input中相应元素的个数。
      //如Input里面有2个3,那么C[3]=2;
      for(int i=0;i<len;i++)
            C[Input[i]-1]++;

      //数组C的下标对应着Input中小于等于相应元素的个数。
      //如小于等于3的元素的个数为4,则C[3]=4;
      for(int j=1;j<k;j++)
            C[j]+=C[j-1];

      //根据小于等于该元素的个数,得知应该放入的位置。
      //比如C[3]=4,那么3应该放在Output的第四个空格。
      for(int n=len-1;n>=0;n--)
      {
            Output[C[Input[n]-1]-1]=Input[n];
            //每放完一个,就将该元素对应的个数减一
            C[Input[n]-1]--;
      }
      delete[] C;
}

void main()
{
      int Input[]={3,5,2,1,8,9,7,6,3,5,8,4};
      int len=sizeof(Input)/sizeof(int);
      int *Output=new int[len];
      Counting_Sort(Input,Output,len,9);
      for(int i=0;i<len;i++)
            cout<<Output[i]<<endl;
      delete[] Output;
}

最浪费时间的地方是数组下标那里,毕竟书上给的是伪码,数组从1开始,但是实现的时候我还是想遵循从零开始的规则,再加上这个程序本来就是下标一个套一个,弄得我晕头转向啊,少减个一就会溢出的。

你可能感兴趣的:(计数,职场,休闲,CountingSort)