最大子陣列問題及C語言實現

2021-06-26 16:03:04 字數 1452 閱讀 4070

對於乙個連續的陣列a[n],要求連續子陣列,使得該子陣列的和最大。比如陣列,最大子陣列為,和為32。

方法一:窮舉法。即將任取陣列中的兩個元素,算出兩者之間(包括這兩個元素本身)所有元素之和。窮舉所有組合,比較得到最大值。該方法複雜度為n的三次方。

#include #include int sort(int *,int,int);

main()

; printf("%d\n",sort(a,0,15));

}int sort(int *a,int low,int high)

if (sum > max_sum)

max_sum = sum;

} }return max_sum;

}

方法二:遞迴法。以陣列中間元素為分界,將整個陣列分為左邊的陣列和右邊陣列。那麼最大子陣列有三種情況,分別是完全位於左陣列,完全位於右陣列以及橫跨中間元素的陣列。分別對左右陣列進行遞迴,得到最終答案。該方法複雜度為nlgn。

#include #include int find_max_crossing_subarray(int *,int,int,int);//橫跨左右陣列的最大子陣列

int find_maximum_subarray(int *,int,int);//返回最大子陣列的和

main()

; printf("%d\n",find_maximum_subarray(a,0,15));

}int find_max_crossing_subarray(int *a,int low,int mid,int high)

} sum = 0;//處理右陣列

for (i = mid+1;i <= high;i++)

} return left_sum + right_sum;

}int find_maximum_subarray(int *a,int low,int high)

else

}

方法三:

當我們加上乙個正數時,和會增加;當我們加上乙個負數時,和會減少。因此,當和為負數時,應該清零,並重新開始尋找最大子陣列,當陣列元素全為負數時,找到最大元素即可。

#include #include int line_sort(int *,int,int);

main()

; printf("%d\n",line_sort(a,0,15));

}int line_sort(int *a,int low,int high)

if (sum > max_sum)

} if (max_sum == 0)

} }printf("index_start:%d, index_end:%d \n",index_start,index_end);

return max_sum;

}

最大子列和問題(C語言實現)

最大子列和問題 pta 程式設計類實驗輔助教學平台 給定k 個整數組成的序列,連續子列 被定義為,其中 1 i j k。最大子列和 則被定義為所有連續子列元素的和中最大者。例如給定序列,其連續子列有最大的和20。現要求你編寫程式,計算給定整數序列的最大子列和。本題旨在測試各種不同的演算法在各種資料情...

最大子矩陣 C語言實現

演算法核心 先將二維陣列處理為一維陣列,再對一維陣列進行最大連續子串行求和,這裡最大連續子串行求和採用的是遞推的方法。演算法步驟 1 將原矩陣初始化,並建立乙個臨時二維矩陣,該矩陣的第i行表示的是原矩陣前i行的和 2 採用窮舉的方法,計算二維矩陣所有可能的連續行的列的和,使其壓縮為一維陣列 3 對步...

演算法導論筆記 最大子陣列C語言實現

在分治策略中我們將遞迴的求解乙個問題,在每層遞迴中有如下三個步驟。分解將問題劃分為一些子問題,子問題形式與原問題一樣,只是規模更小。解決遞迴的求解出子問題。如果子問題規模足夠小,則停止遞迴,直接求 解。合併將子問題的解合併為原問題的解。需要遞迴求解時,我們稱之為遞迴情況,當子問題足夠小時,不需要遞迴...