我试图编写一个程序,仅使用2个进程对字符串执行递归排序:
所以例如,如果我有一个char数组{"b","e","c","a","d"}
;
在此测试用例中,程序将按以下顺序执行过程:
2111212最终获得所需的输出("abcde"
)。
我试图弄清楚我需要使用什么程序逻辑来实现这种行为,这是我到目前为止所尝试的:
private static int sort(String[] items, String[] target, int first, int last) {
if(Arrays.equals(target, items)) {
return 1;
}
else if(items[first].compareTo(items[last]) > 0) {
String temp = items[last];
for(int i = last-1; i >= 0; i--) {
items[i+1] = items[i];
}
items[first] = temp;
System.out.print("s ");
System.out.println(Arrays.toString(items));
return sort(items,target,first,last);
}
else if (items[first].compareTo(items[first+1]) < 0){
String temp = items[first];
items[first] = items[first+1];
items[first+1] = temp;
System.out.print("b ");
System.out.println(Arrays.toString(items));
return sort(items,target,first,last);
}
return 2;
}
输出不是很正确,我想我在某处有逻辑错误。
答案 0 :(得分:1)
规则限制操作交换第一对元素,并将数组向右旋转。规则没有说明允许的其他操作,但我假设比较也仅限于第一对元素。我还假设数组的大小是已知的,让n等于数组中元素的数量。
一个迭代(非递归)策略是通过使用compare找到数组中当前最小的元素,如果乱序则交换,并旋转,以便当前最小的元素交换到array[0]
如果需要,然后旋转将其移动到array[1]
。
要找到n个元素中的最小元素,它将需要主循环的n-1
次迭代,比较,如果乱序则交换,向右旋转。在n-1
次迭代后,最小的元素最终为array[1]
。再做一次旋转,使最小元素现在位于array[2]
,并且要在array[0]
和array[1]
处检查新值。
然后进行n-2
次迭代以找到第二个最小元素。这将以array[0]
处的最小元素和array[1]
处的第二小元素结束。所以现在对2个元素进行排序。将数组旋转2次以将已排序的运行移至array[2]
和array[3]
,以使用array[0]
和array[1]
处的新值设置下一个循环。
序列继续,n-3
迭代找到第三个最小元素,旋转数组3次。对于每个i = 1
到n-1
,它进行n-i
次迭代迭代,如果乱序则交换,旋转1次,然后在迭代后旋转数组i
次。
此后,第二大元素位于array[1]
,最大元素位于array[2]
。旋转n-2
次以获取已排序的数组。
示例,比较每个迭代,如果需要,交换,旋转一次
b a d e c do 4 iterations
c a b d e
e a c b d
d a e c b
b d a e c do 1 rotate
c b d a e do 3 iterations
e b c d a
a b e c d
c d a b e do 2 rotates
e c d a b do 2 iterations
b c e d a
e d a b c do 3 rotates
c d e a b do 1 iteration
a b c d e do final 2 rotates
答案 1 :(得分:0)
规则1将数组视为循环缓冲区,允许您将其移动到任何位置,同时保持相同的顺序(以缓冲区的长度为模)。规则2更改顺序,但仅限于当前位置。
一种效率很低的方法是通过将不在正确位置的最小值移动到已排序的组的末尾来实现冒泡排序。这可以通过用规则1移动直到它处于第二位置然后交替规则2和2来完成。 1.一旦它们全部按规则1顺序移动,直到最小的数字为第一个。