गलत तर्क
सेशन के कोड के कारण विफल रहता है
}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 परीक्षण पाश प्रति.
for
पाश एक बार (यदि) दोनों झंडे बनfalse
.