基本上,我們需要使用函式檢查一維陣列的元素是否排序:如果它們按升序排序:如果它們按降序排序則回傳1:如果它們沒有排序則回傳-1:回傳0這是我使用的方法,但它不回傳 1 而是回傳 0,我不確定問題出在哪里,歡迎任何評論或解決問題的新方法,因為我是初學者。
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;
}
uj5u.com熱心網友回復:
錯誤的邏輯
由于 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;
}
可能進行簡化和一些微優化,但需要澄清一個明確的方法。
uj5u.com熱心網友回復:
對于初學者來說,函式應該被宣告為
int Is_Sorted( const int* A, size_t n );
也就是說,至少第一個引數應該具有限定符,const因為傳遞的陣列沒有在函式內更改。
變數tempcr和tempdcr未初始化并且具有不確定的值。因此該函式具有未定義的行為。你必須像這樣初始化它們
int tempcr = 0, tempdcr = 0;
如果已經知道陣列由于效率低下而未排序,則繼續回圈迭代是沒有意義的。
此外,該功能有一個邏輯錯誤。
考慮陣列 { 0, 0, -1 }
在這種情況下,在回圈的第一次迭代中,變數tempcr將由于 if 陳述句而增加
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指出的那樣 -在他的回答中恢復 Monica,而不是計算元素,您可以將相應的變數用作布爾物件。在這種情況下,函式看起來像
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 );
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/364322.html
