【问题标题】:How can I check if sorted and rotated array is in ascending or descending order?如何检查排序和旋转的数组是升序还是降序?
【发布时间】:2019-11-19 15:04:51
【问题描述】:

我需要检查排序和旋转的数组是升序还是降序。我需要知道它才能通过修改后的二进制搜索找到旋转计数。

例如:

[5, 6, 1, 2, 3, 4]

是升序,但是

[2, 1, 6, 5, 4, 3]

按降序排列

Python 实现会很棒。感谢您的帮助!

【问题讨论】:

  • [5, 6, 1, 2, 3, 4] 是如何排序或升序的?
  • @luigigi 它是一个“循环数组”。把它想象成有array[6] == 5,等等。显然,底层数据结构不支持该索引,但这就是所表示的。
  • @Scott 谢谢,我明白了
  • @luigigi 如果您之前对我的帖子投了反对票,请删除您的反对票。如果不是您,请不要介意此评论。谢谢
  • 有一个 Dave 算法的实现,无论列表有多大,它都需要相同的时间。如果你把你目前所拥有的,可能有人可以提供帮助。

标签: python arrays algorithm sorting


【解决方案1】:

简单的恒定时间方法是检查任何 3 个相邻对。最多一个包含边界,因此大多数与数组具有相同的顺序。

这些可以重叠。例如,如果 a,b,c,d 在数组中是相邻的,那么对 ab,bc,cd 就可以了。

环绕很好。例如对于数组 abc,检查 ab, bc, ca

【讨论】:

  • 边缘案例:[2,3,1]
  • @scott 环绕
  • [1,1,1,1,1,1,1,2,3] ...但可能OP需要指出所有元素都是唯一的。
  • 是的。或者你需要找到 3 对不同的 elts,如果雾 elts 相同,它们可能是线性的
【解决方案2】:

我正在使用 Java 提供代码,你可以看看它是否有帮助

public class IsSorted {

public static void main(String[] args){
    int[] list ={4,3,2,1};
    System.out.println(isSorted(list));

}

public static int isSorted(int[] a){

    if(a.length==0){
        return 1;
    }
    if(a.length==1){
        return 1;
    }

    int[] holdingArray=new int[a.length];

    for (int i =0; i<a.length; i++){
        holdingArray[i]=a[i];
    }


    int[] virtualIncreasedArray= new int[holdingArray.length];
    int[] virtualDecreasedArray= new int[holdingArray.length];
    sortIncrease(holdingArray);

    for(int i=0; i<holdingArray.length;i++){
        virtualIncreasedArray[i]=holdingArray[i];
    }
    sortDecrease(holdingArray);

    for(int i=0; i<holdingArray.length;i++){
        virtualDecreasedArray[i]=holdingArray[i];
    }

    //check if array is decreasing
    for(int i=0; i<virtualDecreasedArray.length;i++){
        if(virtualDecreasedArray[i]!=a[i]&&virtualIncreasedArray[i]!=a[i]){
            return 0;
        }

    }
    //check if array is increasing


    return 1;
}


static void sortIncrease(int[] a){
    for(int unsorted=a.length-1; unsorted>0; unsorted--){
        for(int i=0; i<unsorted;i++){
            if(a[i]>a[i+1]){
                swap(a,i,i+1);
            }
        }
    }
}


static void sortDecrease(int[] a){
    for(int unsorted=a.length-1; unsorted>0; unsorted--){
        for(int i=0; i<unsorted; i++){
            if(a[i]<a[i+1]){
                swap(a,i,i+1);
            }
        }
    }
}

static void swap(int[] a, int i, int j){
    if(i==j){
        return;
    }
    int temp = a[i];
    a[i]=a[j];
    a[j]=temp;
}

}

【讨论】:

  • 如果数组是升序或降序返回1,否则返回0
猜你喜欢
  • 1970-01-01
  • 2018-09-23
  • 1970-01-01
  • 1970-01-01
  • 2021-03-27
  • 2022-01-10
  • 1970-01-01
  • 2021-12-20
  • 1970-01-01
相关资源
最近更新 更多