을 확인해야 경우 배열 정렬된 함수를 사용하여 C

0

질문

기본적으로,우리는 필요한 경우 확인 요소의 1D 배열 정렬을 사용하여 기능: 면 그들은 정을 오름차순으로택:1 만약 그들이 정렬되는 내림차순으:-1 을 반환 그렇지 않은 경우 정렬:0 이 방법을 사용하면 좋은,그러나 그것은 반 1isntead0,Im 어디에이 문제,모든 의견 또는 새로운 방법의 문제를 해결을 환영합 이후 im 초보자.

int Is_Sorted(int* A, int n){
    int tempcr, tempdcr;

for (int i=0; i<N-1; i++){

    if (A[i]<=A[i+1]){
        tempcr++;
    }else if (A[i]>=A[i+1]){
    tempdcr++;
    }
}
   if(tempcr==N-1){
        return 1;
   }else if(tempdcr==N-1)
        return -1;
   else
    return 0;

}
algorithm arrays c sorting
2021-11-23 21:26:44
2

최고의 응답

2

잘못 로직

OP 의 코드 실패로 인해

}else if (A[i]>=A[i+1]){
tempdcr++;

}
if (A[i]>=A[i+1]) {
  tempdcr++;

을 고려하는 경우 A[i]==A[i+1]모두,카운터가 증가 한다.

값이 정크

누락 초기화 @kaylum.

// int tempcr, tempdcr;
int tempcr = 0;
int tempdcr = 0;

다른 방법:

가는 4 가능성

  • 배열의 값이 동일한 값을 모든 곳입니다-또는 의의 길이 0.

  • 배열을 오름차순입니다. A[i] >= A[i-1]i > 0 고의 길이는보다 더 많은 0 입니다.

  • 배열이 내림차순으로. A[i] <= A[i-1]i > 0 고의 길이는보다 더 많은 0 입니다.

  • 위의 없음.

단순히 반복하고 조정 플래그입니다. int tempcr, tempdcr; 카운터가 필요하지 않습니다.

int Is_Sorted(const int* A, int n) {
  bool isAscending = true;
  bool isDescending = true;
  for (int i = 1; i<n; i++) { // start at 1
     if (A[i] < A[i-1]) isAscending = false;
     if (A[i] > A[i-1]) isDescending = false;
  }
  if (isAscending && isDescending) {
    return TBD; // Unsure what OP wants here
  }
  if (isAscending) {
    return 1;
  }
  if (isDescending) {
    return -1;
  }
  return 0;
}

단순화와 일부 마이크로 최적화를 가능하지만,무언가를 명확하게 명확한 접근 방식이다.


너무 많은 재미 있습니다.

는 경우 int a[] 이 일정하지 않은,우리가 사용할 수 있고 1 시험 반복 당신 3: 하는 테스트, 더 적은, 위의 코드입니다.

먼저 찾는 불평등에서 끝을 향해 처음이다. 첫 번째 요소는 조정이 다를 수 있습니다.

면 우리는 전체 목록,우리가 수행,그렇지 않으면의 첫 부분에 목록에서 다릅니다 마지막 요소입니다.

마지막으로 비교가 오름차순으로 설정하는 첫 번째 요소 INT_MAX 검색 시작을 향한 비 오름차순이다.

그렇지 않으면
마지막으로 비교하는 내림차순으로 설정하는 첫 번째 요소 INT_MIN 검색 시작을 향해 아닌 내림차순으로 쌍입니다.

을 찾아 비교 오류가 발생하거나 배열이 정렬되지 않은 것 또는 우리는 시작 부분에 있습니다. 는 경우,시작 부분에 처리하는 특별한 경우입니다.

어떤 경우에,1 비교당의 반복이다.

#define ASCENDING 1
#define DESCENDING -1
#define UNORDERED 0
#define ALLSAME 1 // Adjust as desired
#define SHORT_LENGTH 1 // Adjust as desired

int is_sorted(size_t n, int *a) {
  if (n <= 1) {
    return n ? ALLSAME : SHORT_LENGTH;
  }

  int last = a[--n];
  int first = a[0];
  a[0] = !last;
  while (last == a[--n]) {
    ;
  }
  a[0] = first; // restore
  if (n == 0) {
    if (a[0] < a[1]) {
      return ASCENDING;
    }
    if (a[0] > a[1]) {
      return DESCENDING;
    }
    return ALLSAME;
  }

  if (a[n - 1] < a[n]) {
    // Only ascending, unordered possible
    a[0] = INT_MAX;
    while (a[n - 1] <= a[n]) {
      n--;
    }
    a[0] = first; // restore
    if (a[n - 1] <= a[n]) {
      return ASCENDING;
    }
  } else {
    // Only descending, unordered possible
    a[0] = INT_MIN;
    while (a[n - 1] <= a[n]) {
      n--;
    }
    a[0] = first; // restore
    if (a[n - 1] <= a[n]) {
      return DESCENDING;
    }
  }
  return UNORDERED;
}

나는 몇 가지 더 많은 테스트니다.

을 경우 배열 const필요 2 개의 시험을 당다.

2021-11-24 05:24:03

당신이 휴식 할 수있의 for 반복되면(해당되는 경우)모두 플래그가 false.
500 - Internal Server Error

@500-InternalServerError True,아직하지 않는 특정 최적화할 수 있으므로 이 또한 느리게 실행되므로 시간이 더 많은 일을 확인합니다. 따라 달라집의 일반적인 배열을 설정합니다. IAC,그것을 감소시키지 않는 O(). 더 여기에.
chux - Reinstate Monica

@500-InternalServerError 재미를 위해,그것은 흥미로운 일이 될 수 있습을 격파 배열에서 각 단계는 비교 확인 끝 지점까지 아래로 크기는 1. 확실히 느린 최악의 경우에만 가능성이 잡기 초기 비 배열 순서 허용을 위한 단 하나기 위해 비교 및/또는 엔드-조기 코드입니다.
chux - Reinstate Monica

큰 배열을,또는 경우에는 코드는 일반화 경기 qsort()bsearch()초기 휴식될 가능성이 유익한 성능을 위해—그것은 피할 수 잠재적으로 많은 함수 호출합니다. 데이터 타입 int오버헤드의 비교는 훨씬 작은,그래서 일찍 끊 대의 추가 테스트는 그렇지 않습니다.
Jonathan Leffler

@500-InternalServerError 그래서 난 몇 가지 재미있게만 사용하는 1 비교 당다.
chux - Reinstate Monica

올바른 방법으로 완료 프로그램 및 테스트? (나는 녹슨 C)
Kelly Bundy
1

시동기를 위해 함수해야는 다음과 같이 선언

int Is_Sorted( const int* A, size_t n );

는 최소한 첫 번째 매개 변수가 규정 const 기 때문에 전달되는 배열되지 않을 변경 내에 기능입니다.

변수 tempcrtempdcr 초기화되지 않고 비활성화 상태 값을 가집니다. 그래서 함수가 정의되지 않은 행동이다. 당신이 초기화음

int tempcr = 0, tempdcr = 0;

아무 의미가 없을 계속 반복의 경우 루프 이미 알려져 있는 배열 정렬하지 않기 때문에 그것은 비효율적이다.

또한 기능은 논리적 버그입니다.

을 고려하는 배열 { 0, 0, -1 }

이 경우에는 첫 번째 루프 반복 변수 tempcr 인해 증가하는 경우 성명

if (A[i]<=A[i+1]){
    tempcr++;
}else if (A[i]>=A[i+1]){
tempdcr++;
}

하지만에 두 번째는 루프 반복 변수 tempdcr 이 증가 될 것이다.

그래서 기능이 있는 보고서 배열 정렬되어 있지 않지만 그것을 내림차순으로 정렬.

나는 함수를 정의는 다음과 같은 방법으로

int is_sorted( const int a[], size_t n )
{
    size_t ascending = 0, descending = 0;

    for (size_t i = 1; ( ascending == 0 || descending == 0 ) && i < n; i++)
    {
        if ( a[i-1] < a[i] ) ++ascending;
        else if ( a[i] < a[i-1] ) ++descending;
    }

    return descending == 0 ? 1 : ( ascending == 0 ? -1 : 0 );
}

는 경우 전달되는 배열에 모든 요소가 동등한 각각 다른 기능을 고려으로 오름차순으로 정렬.

로 지적 @chux-복원모니카 에서 그의 대답을 대신 계산 요소를 사용할 수 있습니다 해당하는 변수로는 부울체입니다. 이 경우에는 기능을 같이 볼 수 있는

int is_sorted1( const int a[], size_t n )
{
    int ascending = 0, descending = 0;

    for (size_t i = 1; ( ascending == 0 || descending == 0 ) && i < n; i++)
    {
        if ( a[i-1] < a[i] ) ascending = 1;
        else if ( a[i] < a[i-1] ) descending = 1;
    }

    return descending == 0 ? 1 : ( ascending == 0 ? -1 : 0 );
}
2021-11-23 21:49:44

다른 언어로

이 페이지는 다른 언어로되어 있습니다

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................