這篇博客我准備寫一些我見過的算法,雖然現在我見過的還很少,但我相信會越來越多,方便日後自己查閱
好了 開始了
求解最大子序列和的最有效的算法
1 int MaxSubsequenceSum(const int A[], int N)
2 {
3 int ThisSum, MaxSum, j;
4 // 定義本次循環的和 與 最大和 為0
5 ThisSum = MaxSum = 0;
6 // 循環求和
7 for (j = 0; j < N; j++)
8 {
9 ThisSum += A[j];
10 // 判斷本次的和與最大和的大小,如果本次和比最大和大,把本次和的值賦值給最大和
11 if (ThisSum > MaxSum)
12 MaxSum = ThisSum;
13 /* 如果本次和小於0,將本次和賦值為0 因為加到小於0了肯定不是最大子序列和了
14 將其賦值為0 從新進行最大子序列和的比較 */
15 else if ( ThisSum < 0)
16 ThisSum = 0;
17 }
18 return MaxSum;
19 }
20 // 這個算法只循環了一次數組就求出了最大子序列和
已知排序好的數組,求某個值的下標---->對分查找
1 int BinarySearch( const int A[], int X, int N)
2 {
3 // 定義最小坐標,中間坐標,最大坐標
4 int Low, Mid, High;
5 Low = 0; High = N - 1;
6 // 循環條件 最小坐標<=最大坐標
7 while (Low <= High) {
8 // 中間坐標算出來
9 Mid = (Low + High) / 2;
10 // 判斷中間坐標對應的值是否小於要找到的值
11 if (A[Mid] < X) {
12 /* 如果小於讓最小坐標變成中間坐標 + 1
13 (也就是不用考慮中間坐標前面的數了) */
14 Low = Mid + 1;
15 } else if (A[Mid] > X) {
16 /* 如果大於讓最大坐標變成中間坐標 - 1
17 (也就是不用考慮中間坐標後面的數了) */
18 High = Mid - 1;
19 } else {
20 // 循環找到坐標
21 return Mid; // Found
22 }
23 }
24 return -1; // Not Found
25 }
計算最大公因數(歐幾裡德算法)
兩個整數的最大公因數(Gcd)是同時整除二者的最大整數 例:Gcd(50, 15) = 5
1 unsigned int Gcd (unsigned int M, unsigned int N)
2 {
3 unsigned int Rem;
4 while ( N > 0) {
5 Rem = M % N;
6 M = N;
7 N = Rem;
8 }
9 return M;
10 }
11 // 算法通過連續計算余數直到余數是0為止,最後的非零余數就是最大公因數
高效率的取冪算法
1 /*
2 如果N是偶數,我們有 X的N次方 = X的N/2次方 * X的N/2次方
3 如果N是奇數,我們有 X的N次方 = X的(N - 1)/2次方 * X的(N - 1)/2次方 * X
4 */
5 long int Pow (long int x, int N)
6 {
7 if (N == 0) {
8 return 0;
9 }
10 if (N == 1) {
11 return x;
12 }
13 if (N % 2 == 0) {
14 return Pow(x*x, N/2);
15 } else {
16 return Pow(x*x, N/2) * x;
17 }
18 }
19 // 此算法運用到了遞歸
數組排序:冒泡排序
1 void sortArray(int a[], int len)
2 {
3 for (int i = 0; i < len-1; i++) {
4 /*
5 每趟排序都會確定一個數,所以需要再循環len-i次,但因為每次都是
6 相鄰的兩個數比較,為了a[j + 1]不越界,讓j循環到len-i-1時停止
7 */
8 for (int j = 0; j < len-i-1; j++) {
9 int tmp;
10 // 如果條件滿足,交換a[j]和a[j+1]兩個相鄰數的值
11 if (a[j] > a[j+1]) {
12 tmp = a[j];
13 a[j] = a[j+1];
14 a[j+1] = tmp;
15 }
16 }
17 }
18 }
數組排序:選擇排序
1 void selectSort(int a[], int len)
2 {
3 // 確定需要排序的次數
4 for (int i = 0; i < len - 1; i++) {
5 // 每一次都是拿一個元素與後面其他的元素進行比較,找到最小值
6 for (int j = i + 1; j < len; j++) {
7 if (a[i] > a[j]) {
8 int tmp = a[i];
9 a[i] = a[j];
10 a[j] = tmp;
11 }
12 }
13 }
14 }
-----------------------------------------------未完待續-----------------------------------------------
提示:1、代碼由本人手打如有失誤請麻煩提醒下,我將及時改正
2、注釋代表個人理解有歧義請指教,謝謝