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}
编辑:有关如何在没有额外内存的情况下就地合并两个阵列,请查看我的解决方案:
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))复杂度。