Błędna logika
Kod operacji wywala z powodu
}else if (A[i]>=A[i+1]){
tempdcr++;
powinno być
}
if (A[i]>=A[i+1]) {
tempdcr++;
Rozważmy przypadek, gdy A[i]==A[i+1]
oba licznika powinny rosnąć.
Niepotrzebne Wartości
Brakuje inicjowanie @kaylum.
// int tempcr, tempdcr;
int tempcr = 0;
int tempdcr = 0;
Alternatywne podejście:
Są 4 możliwości
Tablica ma to samo znaczenie, gdzie lub ma długość 0.
Tablica rośnie. A[i] >= A[i-1]
dla wszystkich i > 0
i długość jest większa niż 0.
Tablica idzie malejąco. A[i] <= A[i-1]
dla wszystkich i > 0
i długość jest większa niż 0.
Żaden z powyższych.
Po prostu зациклите i ustaw dwie flagi. int tempcr, tempdcr;
liczniki nie są potrzebne.
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;
}
Możliwe są pewne uproszczenia i микрооптимизация, ale coś wyjaśni wyraźny podejście.
Zbyt zabawne.
Jeśli int a[]
nie jest stały, możemy użyć tylko 1 test na iterację zamiast 3: testy i, mniej, więcej z powyższego kodu.
Najpierw spójrz na nierówności od końca do początku. Pierwszy element jest regulowany tak, aby różnił się on od tego ostatniego.
Jeśli przejdziemy pełna lista skończymy, w przeciwnym razie pierwsza część listy różni się od ostatniego elementu.
Jeśli to ostatnie porównanie jest wykonywane w kolejności rosnącej, zaznacz pierwszy element wartość INT_MAX
i szukajcie na początku nie wzrosty na parze.
Inaczej
Jeśli to ostatnie porównanie jest wykonywane malejąco, zaznacz pierwszy element wartość INT_MIN
i szukajcie na początku неубывающую parę.
W przypadku wykrycia błędu porównania lub tablica неупорядочен, albo znajdujemy się na początku. Jeśli na początku zapoznaj się z tym szczególnym wydarzeniem.
W każdym razie, tylko 1 porównanie za iterację.
#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;
}
Zrobię jeszcze kilka testów później.
Jeśli tablica jest const
trzeba 2 test na cykl.
for
cykl jeden raz (jeżeli) obie flagi stają sięfalse
.