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

时间:2016-12-07 01:15:47

标签: c arrays string sorting radix-sort

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

我制作了一个数组" char字符串[3] [8]"和" char输出[3] [8]"得到3个字符串,每个字符串中有7个字符。例如,对这些字符串进行排序:

import javafx.application.Application;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.ComboBox;
import javafx.scene.control.Label;
import javafx.scene.layout.GridPane;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;

public class Main extends Application {
    @Override
    public void start(Stage stage) throws Exception {

        StackPane root = new StackPane();

        Scene scene = new Scene(root, 450, 250);

        Button btn = new Button();
        btn.setText("Run");

        final ComboBox<String> comboBox = new ComboBox<>();
        comboBox.getItems().addAll("Phase 1", "Phase 2", "Phase 3", "Phase 4", "Phase 5");

        GridPane grid = new GridPane();

        grid.setVgap(10);
        grid.setHgap(10);
        grid.setPadding(new Insets(5, 5, 5, 5));
        grid.add(new Label("Select Phase: "), 0, 0);
        grid.add(comboBox, 1, 0);
        grid.add(new Label("Select Data: "), 0, 1);
        grid.add(btn, 0, 2);


        root.getChildren().add(grid);
        stage.setScene(scene);

        stage.show();
    }

    public static void main(String[] args) { launch(args);}
}

在输出中我得到:

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

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

我的代码如下所示:

dakaaaa
juparbs
kypbxrw

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

2 个答案:

答案 0 :(得分: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];
        }
    }

答案 1 :(得分:0)

你可以做一个循环列表,但这有点开销。我建议你使用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;
}