Data structures 排序随机数组
我有一个数组,在这些数组中我可以有10个元素。我必须按顺序管理这些名人 我尝试使用选择排序算法,但最大交换限制不允许我这样做 谁能带我去吗 谢谢 算法是:Data structures 排序随机数组,data-structures,Data Structures,我有一个数组,在这些数组中我可以有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;
}