检查数组是否已排序的函数

时间:2016-05-09 01:04:24

标签: c++ arrays pointers

所以我在C ++方面只是一个笨拙的程序员,我必须编写一个函数来检查int数组是否使用指针排序(不允许使用索引符号),这是我到目前为止所拥有的: / p>

bool isSorted(const int *ar, int size) {
    bool sorted = true;
    const int *ptr1, *ptr2, *ptr3;
    ptr1 = ar;
    ptr2 = ar+1;
    ptr3 = ar+size;

    for (ptr1; ptr1 < ptr3; ptr1++) {
        for (ptr2; ptr2 < ptr3; ptr2++) {
            if (*ptr1 > *ptr2) {
                sorted = false;
            }
        }
    }
    return sorted;
}

但是,我似乎无法让它工作,因为无论数组是否排序,它总是返回true。感谢任何帮助。谢谢。

2 个答案:

答案 0 :(得分:3)

  

&#34;你越是疏忽管道,就越容易停下来   漏&#34; - Scotty,Star Trek III。

你使这变得比以前复杂得多。

问自己一个基本问题:什么是排序数组?

答案:一个数组,其中每个连续元素不小于其前一个元素。

因此:要检查数组是否已排序,只需查找小于其前一个元素的元素。如果找到一个,则不对数组进行排序。如果找不到,则必须对数组进行排序。

bool isSorted(const int *ar, int size) {

    if (size == 0)
        return true;   // Edge case

    int previous_value= *ar;

    while (size)
    {
       if (*ar < previous_value)
             return false;
       previous_value= *ar;

       ++ar;
       --size;
     }
     return true;
}

没有索引表示法,只有一个指针。不需要进行任何类型的嵌套搜索等...如果你只想使用指针,你可以这样做:

bool isSorted(const int *ar, int size) {

    const int *previous_value=ar;

    while (size)
    {
       if (*ar < *previous_value)
             return false;
       previous_value= ar;

       ++ar;
       --size;
     }
     return true;
}

实际上,我更喜欢这个版本。

答案 1 :(得分:0)

你应该保持ptr2始终是ptr + 1,所以你需要在()中将ptr2初始化为秒。 我认为只有一个循环更好。

for(; ptr2 < ptr3; ++ptr1, ++ptr2) {
    if (*ptr1 > *ptr2) {
        sorted = false;
    }
}

return sorted;
相关问题