排序随机数组

时间:2013-09-15 06:36:25

标签: data-structures

我给了一个阵列,在这些我可以有10个元素。我必须按排序顺序管理这些celem

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

请有人带领我。

谢谢!

1 个答案:

答案 0 :(得分:3)

算法是:

  1. 从数组右侧开始,将所有数据交换到数组的左侧。
  2. 从数组右侧开始(再次),在所有a之后将所有b交换到数组的左侧。
  3. 从数组右侧开始(再次),在所有a和b之后将所有c交换到数组的左侧。
  4. 这一切都保留了你的颜色交换限制,因为例如颜色'e'可以在步骤1-5的每个步骤中移动一次,但随后就可以单独移动。

    要做到这一点,你必须小心不要用相同的颜色交换颜色(也避免了这种情况的退化情况,与自己交换一些东西)。

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

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