基数排序时如何使字符串粘在一起?

Posted

技术标签:

【中文标题】基数排序时如何使字符串粘在一起?【英文标题】:How to make strings stick together while radix sorting? 【发布时间】:2016-12-07 01:15:47 【问题描述】:

我必须制作一个程序,使用基数排序对字符串(精确长度为 7 个字符)进行排序。我已经制作了一个单独对每一列进行排序的函数。我的问题是如何使整个字符串移动,而不仅仅是一个字符。看看它应该如何在 C 中工作对我来说真的很成问题。

我创建了一个数组“char strings[3][8]”和“char output[3][8]”来排序 3 个字符串,每个字符串有 7 个字符。例如对这些字符串进行排序:

strcpy(strings[0], "kupbars");
strcpy(strings[1], "daparba");
strcpy(strings[2], "jykaxaw");

在输出中我得到:

dakaaaa
juparbs
kypbxrw

每一列都已正确排序,但字符不会粘在一起。我用了 3 个小时尝试了很多方法,但没有任何效果。

我的代码如下所示:

void countingSort(char a[][8], char b[][8]) 
  int c[123];
  for (int pos = 6; pos >= 0; pos--) 
    for (int i = 0; i < 123; i++)
      c[i] = 0;
    for (int i = 0; i < 3; i++)
      c[(int)a[i][pos]]++;
    for (int i = 1; i < 123; i++)
      c[i] += c[i - 1];
    for (int i = 2; i >= 0; i--) 
      b[--c[(int)a[i][pos]]][pos] = a[i][pos];
    
  

(有限制字符串长度等的常量,因为很容易将其更改为变量 - 我只是专注于让这个程序正常工作。)

【问题讨论】:

我相信它通常是用每个数字桶的链表来实现的,它会有指向整个字符串的指针。 (您需要更复杂的数据结构;很难就地完成) 【参考方案1】:

尝试改变循环来移动整个字符串:

    for (int i = 2; i >= 0; i--) 
        int k = --c[(int)a[i][pos]];
        for(int j = 0; j < 8; j++) 
            b[k][j] = a[i][j];
        
    

【讨论】:

非常感谢,它有效! :) 也许其他用户的建议也可以,但你的建议对我来说是最容易理解的 内部 for 循环可以用 memcpy() 或 memmove() 代替,但我尝试使用基本示例。 @lemka8 别担心,这个答案很好。我 ♥ 像 rcgldr 一样回答,但我的极限是两个 for 函数循环。因此,我不接受您的代码并向您提出“更清洁”的解决方案。不要犹豫,以后试试我的。如果你想用 C 语言编写,你需要一个理解指针。顺便说一句,欢迎来到堆栈溢出,这是一个很好的问题。【参考方案2】:

你可以做一个循环列表,但这有点开销。我建议你使用memmove()。

#include <string.h>

void array_move_forward(char array[3][8]) 
  for (int i = 0; i < 3; i++) 
    char tmp = array[i][6];
    memmove(array[i] + 1, array[i], 6);
    array[i][0] = tmp;
  


void array_move_rewind(char array[3][8]) 
  for (int i = 0; i < 3; i++) 
    char tmp = array[i][0];
    memmove(array[i], array[i] + 1, 6);
    array[i][6] = tmp;
  

另一种解决方案是自己操作字符串并使用索引,指示字符串的第一个字母。


  char str[7];
  int i = 0;
  ...
  int j = i;
  for (int k = 0; k < 7; k++) 
    char tmp = str[j++ % 7];
  

您可以使用i++i-- 旋转字符串。

struct my_string_radix 
  char str[7];
  int begin;

【讨论】:

以上是关于基数排序时如何使字符串粘在一起?的主要内容,如果未能解决你的问题,请参考以下文章

让基数/计数排序与负数一起工作

如何使用分布排序(基数排序等)对字符串进行排序?

非负整数的基数排序(按位)

如何使用基数排序对变长字符串数组进行排序?

算法渣-排序-基数排序

如何对包含多个字符串的结构应用基数排序(使用计数排序)