Yanlış mantık
Op'nin kodu nedeniyle başarısız oluyor
}else if (A[i]>=A[i+1]){
tempdcr++;
olmalı
}
if (A[i]>=A[i+1]) {
tempdcr++;
Durumu ne zaman düşünün A[i]==A[i+1]
her iki sayaç da artmalıdır.
Önemsiz Değerler
Başlatma @kaylum eksik.
// int tempcr, tempdcr;
int tempcr = 0;
int tempdcr = 0;
Alternatif yaklaşım:
4 olasılık var
Dizi, her yerde aynı değer değerine sahiptir - veya uzunluğu 0'dır.
Dizi artıyor. A[i] >= A[i-1]
göre i > 0
ve uzunluk 0'dan fazla.
Dizi azalıyor. A[i] <= A[i-1]
göre i > 0
ve uzunluk 0'dan fazla.
Yukarıdakilerin hiçbiri.
Sadece döngü yapın ve iki bayrak ayarlayın. int tempcr, tempdcr;
sayaçlara gerek yok.
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;
}
Basitleştirmeler ve bazı mikro optimizasyonlar mümkündür, ancak net bir yaklaşımı netleştirmek için bir şey.
Çok eğlenceli.
Eğer int a[]
sabit değil, 3 yerine yineleme başına yalnızca 1 test kullanabiliriz: test ı, daha az, yukarıdaki koddan daha fazladır.
Önce eşitsizliği sondan başa doğru arayın. İlk eleman bir öncekinden farklı olacak şekilde ayarlanır.
Tüm listeyi yürürsek, işimiz biter, aksi takdirde listenin ilk kısmı son öğeden farklıdır.
Son karşılaştırma yükseliyorsa, ilk öğeyi şu şekilde ayarlayın: INT_MAX
ve yükselen olmayan bir çift için başa doğru arama yapın.
Aksi takdirde
Son karşılaştırma azalan ise, ilk öğeyi şu şekilde ayarlayın: INT_MIN
ve azalan olmayan bir çift için başa doğru arama yapın.
Bir karşılaştırma hatası oluştuğunda, dizi sırasızdır veya baştayız. Eğer başındaysa, o özel durumu halledin.
Her durumda, yineleme başına yalnızca 1 karşılaştırma.
#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;
}
Daha sonra biraz daha test yapacağım.
Dizi ise const
, döngü başına 2 test gerekir.
for
her iki bayrak da bir kez (eğer) döngüfalse
.