根据字符出现频率排序

void swap(int *a,int *b)
{
  int tmp;
  tmp =*a;
  *a=*b;
  *b=tmp;
}
void selSort(int *s,int n,char **arr,int *arrlen)//选择排序
{
  char *p=NULL;
  int i;
  int j;
  int k;
  int m;
  int offset=0;
  int tmp;
  *arrlen=0;

  for (i=0;i<n-1;i++)
  {
    tmp=s[i];
    k=i;//最大值的下标
    for (j=i;j<n;j++)
    {
      if (tmp<s[j])
      {
        tmp=s[j];
        k=j;
      }
    }
   if (i!=k)//找到了最大值。
    {
        *arrlen+=s[k];//s【k】为单个字符出现的次数。arrlen为所有字符出现的次数。
        *arr =malloc(sizeof(int)*(*arrlen));//动态开辟空间不确定会有多少个字符,因此动态开辟
        if (p!=NULL)
        {
                memcpy(*arr,p,offset);//每一次分配需要将赋值好的值拷贝到新的空间。
                
                free(p);//将原先的值释放掉
                p=NULL;
        }
        p=(char *)*arr;
        for (m=0;m<s[k];m++)
        {

          p[offset]=k;//根据每个字符出现的次数,将字符拷贝到新的数组。
          offset+=1;
        }
        swap(&s[i],&s[k]);//选择排序交换。

    }

  }

}
char* frequencySort(char* s) {
  int i;
  int j;


  int arrlen;
  int l=strlen(s);
  //int arr[256]={0};
  char *arr;
  int tmpArr[256]={0};


  for (i=0;i<l;i++)
  {
    ++tmpArr[s[i]];//统计字符出现的次数,
  }
  selSort(tmpArr,256,&arr,&arrlen);
  for (i=0;i<arrlen;i++)
  {
        s[i]=arr[i];

  }
  return s;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值