Algorithm ?也许您可以使用合并排序(O(nlogn)),您可以将两个数组划分为n个子列表,每个子列表包含1个元素。然后重复合并子列表以获得新的已排序子列表,直到只剩下1个子列表。@VictorLuna我认为这是一个正确的解决方案,但不是最有效的。我相信这个问题可以在

Algorithm ?也许您可以使用合并排序(O(nlogn)),您可以将两个数组划分为n个子列表,每个子列表包含1个元素。然后重复合并子列表以获得新的已排序子列表,直到只剩下1个子列表。@VictorLuna我认为这是一个正确的解决方案,但不是最有效的。我相信这个问题可以在,algorithm,Algorithm,?也许您可以使用合并排序(O(nlogn)),您可以将两个数组划分为n个子列表,每个子列表包含1个元素。然后重复合并子列表以获得新的已排序子列表,直到只剩下1个子列表。@VictorLuna我认为这是一个正确的解决方案,但不是最有效的。我相信这个问题可以在O(n)中完成,实际上合并排序不是O(nlogn),而是O(n+m)。因为列表类似于队列,所以它们指向每个数组中要使用的下一个元素。当它在插入值之前比较这些值时,会进行n+m次比较,使其在运行时为O(n)。@VictorLuna您能描述一下您的


?也许您可以使用合并排序(O(nlogn)),您可以将两个数组划分为n个子列表,每个子列表包含1个元素。然后重复合并子列表以获得新的已排序子列表,直到只剩下1个子列表。@VictorLuna我认为这是一个正确的解决方案,但不是最有效的。我相信这个问题可以在O(n)中完成,实际上合并排序不是O(nlogn),而是O(n+m)。因为列表类似于队列,所以它们指向每个数组中要使用的下一个元素。当它在插入值之前比较这些值时,会进行n+m次比较,使其在运行时为O(n)。@VictorLuna您能描述一下您的算法来回答这个问题吗?@VictorLuna您能展示一下合并排序是如何使用问题中提供的给定样本数组来解决问题的吗?
function:
    for i = 1 to n do
      for j = i + 1 to n do
         if A[j] > A[i] then B[i] = j , B[j] = n + 1
         for k = i + 1 to j - 1 do
            if A[k] < A[k + 1]
               B[k] = j
            else
               B[k] = k + 1
               recursive function(A[j + 1, ... n]) // recursively perform procedure on portion of array starting from j + 1 (after max) to n.
def next_greater_element(A):
    """Return an array of 1-based indices to the next strictly greater element, n+1 if none exists"""
    i=0
    n = len(A)
    NGE=[n+1]*len(A)
    stack=[]
    while i<len(A)-1:
        stack.append(i)
        while stack and A[stack[-1]]<A[i+1]:
            x=stack.pop()
            NGE[x]=i+2
        i+=1
    return NGE

A = [8,3,34,13,1,2,21,5]
B = next_greater_element(A)
print B
[3, 3, 9, 7, 6, 7, 9, 9]
#include <stdio.h>

void find_next_largest(int *a, int *b, int n) {
  int s[n], p = -1;
  for (int i = 0; i < n; i++) {
    while (p >= 0 && a[i] > a[s[p]]) b[s[p--]] = i;
    s[++p] = i;
  }
  while (p >= 0) b[s[p--]] = n;
}

int main(void) {
  int a[] = { 8, 3, 34, 13, 1, 2, 21, 5, }, b[100];
  int n = sizeof a / sizeof a[0];
  find_next_largest(a, b, n);
  for (int i = 0; i < n; i++) printf("%d ", b[i] + 1);
  printf("\n");
  return 0;
}