Data structures 排序随机数组

Data structures 排序随机数组,data-structures,Data Structures,我有一个数组,在这些数组中我可以有10个元素。我必须按顺序管理这些名人 我尝试使用选择排序算法,但最大交换限制不允许我这样做 谁能带我去吗 谢谢 算法是: 从阵列的右侧开始,将所有a交换到阵列的左侧 从阵列的右侧开始(再次),在所有a之后将所有b交换到阵列的左侧 从阵列的右侧开始(再次),在所有a和b之后将所有c交换到阵列的左侧 这将保留您的颜色交换限制,因为例如,颜色“e”可以在步骤1-5的每个步骤中精确移动一次,但随后将被单独移动 要做到这一点,您必须小心不要用相同的颜色交换颜色(也要避免这

我有一个数组,在这些数组中我可以有10个元素。我必须按顺序管理这些名人

我尝试使用选择排序算法,但最大交换限制不允许我这样做

谁能带我去吗

谢谢

算法是:

  • 从阵列的右侧开始,将所有a交换到阵列的左侧
  • 从阵列的右侧开始(再次),在所有a之后将所有b交换到阵列的左侧
  • 从阵列的右侧开始(再次),在所有a和b之后将所有c交换到阵列的左侧
  • 这将保留您的颜色交换限制,因为例如,颜色“e”可以在步骤1-5的每个步骤中精确移动一次,但随后将被单独移动

    要做到这一点,您必须小心不要用相同的颜色交换颜色(也要避免这种退化情况,即用自身交换某些东西)

    代码是这样的(带有一些非常基本的单元测试):

    #包括
    #包括
    整数限制排序(字符*输入,大小){
    int目标=0;
    int-swaps=0;
    对于(字符c='a';c=0;i--){
    如果(输入[i]!=c)继续;
    而(target
    
  • 从阵列的右侧开始,将所有a交换到阵列的左侧
  • 从阵列的右侧开始(再次),在所有a之后将所有b交换到阵列的左侧
  • 从阵列的右侧开始(再次),在所有a和b之后将所有c交换到阵列的左侧
  • 这将保留您的颜色交换限制,因为例如,颜色“e”可以在步骤1-5的每个步骤中精确移动一次,但随后将被单独移动

    要做到这一点,您必须小心不要用相同的颜色交换颜色(也要避免这种退化情况,即用自身交换某些东西)

    代码是这样的(带有一些非常基本的单元测试):

    #包括
    #包括
    整数限制排序(字符*输入,大小){
    int目标=0;
    int-swaps=0;
    对于(字符c='a';c=0;i--){
    如果(输入[i]!=c)继续;
    
    虽然(targetcolor
    类型替换
    char
    ,并使用你的
    数组来确定顺序。我希望这已经足够有帮助了。这里,“a”只能交换1次,“b”可以交换2次,依此类推,它的顺序与颜色数组[26]={a,b,c,…,z}。算法是相同的,但您需要将
    字符
    替换为
    颜色
    类型,并使用
    数组
    确定顺序。我希望这已经足够有帮助了。您有任何编程语言吗?然后请用它标记您的问题。您有任何编程语言吗?然后请标记您的问题用它提问。
    #include <string.h>
    #include <stdio.h>
    
    int limit_sort(char *input, size_t n) {
        int target = 0;
        int swaps = 0;
        for (char c = 'a'; c <= 'z'; c++) {
            for (int i = n - 1; i >= 0; i--) {
                if (input[i] != c) continue;
                while (target < i && input[target] <= c) target++;
                if (target < i) {
                    input[i] = input[target];
                    input[target] = c;
                    swaps++;
                }
            }
        }
        return swaps;
    }
    
    int main(int argc, char**argv) {
        struct {
            char *input;
            char *want;
            int want_swaps;
        } test_cases[] = {
            {"aaa", "aaa", 0},
            {"aba", "aab", 1},
            {"abc", "abc", 0},
            {"acb", "abc", 1},
            {"bbbaaa", "aaabbb", 3},
        };
        int fails = 0;
        for (int i = 0; i < sizeof(test_cases)/ sizeof(test_cases[0]); i++) {
            char t[32];
            strcpy(t, test_cases[i].input);
            int got_swaps = limit_sort(t, strlen(t));
            if (got_swaps != test_cases[i].want_swaps) {
                printf("limit_sort(%s) = %d, want %d\n", test_cases[i].input, got_swaps, test_cases[i].want_swaps);
                fails++;
            }
            if (strcmp(t, test_cases[i].want)) {
                printf("limit_sort(%s) -> %s, want %s\n", test_cases[i].input, t, test_cases[i].want);
                fails++;
            }
        }
        printf(fails ? "FAILED\n" : "OK\n");
        return fails == 0;
    }