我给了一个阵列,在这些我可以有10个元素。我必须按排序顺序管理这些celem
我尝试使用选择排序算法,但最大交换约束不允许我这样做。
请有人带领我。
谢谢!
答案 0 :(得分:3)
算法是:
这一切都保留了你的颜色交换限制,因为例如颜色'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;
}