【问题标题】:Recursive sort, using two functions递归排序,使用两个函数
【发布时间】:2016-01-30 23:16:23
【问题描述】:

我正在尝试编写一个程序以仅使用 2 个进程对字符串执行递归排序:

  1. 将最后一个字符移到前面,并将其他所有字符移到右侧。
  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;
}

输出不太正确,我认为我在某处有逻辑错误。

【问题讨论】:

  • 规则似乎面向迭代过程,而不是递归过程。递归是必需的吗?正如已经回答的那样,可以使用任何相邻的交换方法,如冒泡排序。
  • 除规则外无要求
  • 我对问题进行了一些非常激烈的重新格式化。 OP,如果您认为这会损害您帖子的意图,您可以在修订历史记录中回滚。

标签: java sorting recursion


【解决方案1】:

规则将操作限制为交换第一对元素,并将数组向右旋转。规则没有说明允许哪些其他操作,但我假设比较也仅限于第一对元素。我还假设数组的大小是已知的,让 n 等于数组中的元素数。

一种迭代(非递归)策略是使用比较查找数组中当前最小的元素,如果乱序则交换,然后旋转,以便在需要时将当前最小元素交换为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 = 1n-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

【讨论】:

    【解决方案2】:

    规则 1 将数组视为循环缓冲区,允许您将其移动到任何位置,同时保持相同的顺序(以缓冲区的长度为模)。规则 2 更改顺序,但仅限于当前位置。

    一种相当低效的方法是通过将不在正确位置的最小值移动到已排序组的末尾来实现冒泡排序。这可以通过使用规则 1 移动直到它位于第二个位置然后交替规则 2 和 1 来完成。一旦它们都按规则移动,直到最小的数字排在第一位。

    【讨论】:

      猜你喜欢
      • 2021-07-17
      • 1970-01-01
      • 2012-06-24
      • 2019-09-09
      • 1970-01-01
      • 1970-01-01
      • 2011-02-12
      • 2023-04-06
      • 2022-01-16
      相关资源
      最近更新 更多