Arrays 对先递增后递减的数组进行排序

Arrays 对先递增后递减的数组进行排序,arrays,algorithm,sorting,Arrays,Algorithm,Sorting,给定一个数组,数组中的元素按递增顺序排列,直到最大值,然后按递减顺序排列 Eg. int a[] = { 10, 12, 14, 16, 15, 13, 11}. 如何对该数组进行有效排序 需要对数组进行适当排序。找到最大值,然后将数组反转到该值。然后在两个子阵列上应用合并-第一个子阵列包含最大值,而不是剩余阵列。这将具有线性计算复杂性,并且需要线性额外内存 就你而言: a[]={10,12,14,16,15,13,11}=>{10,12,14,16},{15,13,11} =>反向(线性,在

给定一个数组,数组中的元素按递增顺序排列,直到最大值,然后按递减顺序排列

Eg. int a[] = { 10, 12, 14, 16, 15, 13, 11}.
如何对该数组进行有效排序


需要对数组进行适当排序。

找到最大值,然后将数组反转到该值。然后在两个子阵列上应用合并-第一个子阵列包含最大值,而不是剩余阵列。这将具有线性计算复杂性,并且需要线性额外内存

就你而言:

a[]={10,12,14,16,15,13,11}
=>
{10,12,14,16},{15,13,11}

=>反向(线性,在位)=>

{16,14,12,10},{15,13,11}

=>合并(线性,附加线性内存)=>

{16,15,14,13,12,11,10}

编辑:有关如何在没有额外内存的情况下就地合并两个阵列,请查看我的解决方案:

  • 取两个指针数组开始数组结束

  • 在结果数组中写入两个指针的最小值(如果需要降序排序,则为最大值),然后执行shift 指向1位置的指针(开始指针+1位置和结束指针-1 位置

  • 重复此操作,直到开始指针置于结束指针之后

  • 解的复杂性为O(N)。 所需内存为O(N)

    伪代码:

    function Sort(a)
    {
      startPointer = 0;
      endPointer = a.length-1;
      result = new Array of size a.length
      while (startPointer <= endPointer)
      {
        var newValue;
        if (a[startPointer] < a[endPointer])
        {
          newValue = a[startPointer];
          startPointer +1
        }
        else
        {
          newValue = a[endPointer];
          endPointer -1
        }
        result[a.length - startPointer - endPointer] = newValue;
      }
    
      return result;
    }
    
    函数排序(a)
    {
    起始点=0;
    端点=a.length-1;
    结果=大小为a.length的新数组
    
    while(startPointer使用问题的属性

    不需要对已排序的数组进行排序。找到
    斜率
    变化的点,然后使用合适的
    算法
    获得完整的排序数组


    你可以考虑实现一个高效地使用这个属性的方法。

    我给出了类似的方法来做排序。但是我被要求做到位。你能告诉我如何对这个数组进行排序吗?i=4,{ 10, 11, 12,14, 15, 13,16 }。这是对的?为什么交换14而不是13?“我只考虑最后一个数字。我并不是说我执行最少的操作,只是应该这样做。”i被排序,数组[i,size-1]仍然根据语句进行排序。@Ivaylo:很好的解决方案。但是对于i=4,它确实失败了。我认为我们可以通过执行以下更改来处理这个问题:如果我穿过枢轴元素所在的索引,那么我们必须先减小右索引,然后将索引处的元素与之进行比较,并按照此过程直到达到正确的索引。数组需要就地排序。将此添加到问题中-您应该能够在@titааааааааааааааааааааааа1072排序数组。如果使用合并排序来合并“k”个排序子数组,则这可能需要O(nLog(k))复杂度。