根据字符出现频率排序

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;
}

猜你喜欢

转载自blog.csdn.net/linke_linux/article/details/80599181