這篇博客我准備寫一些我見過的算法,雖然現在我見過的還很少,但我相信會越來越多,方便日後自己查閱
好了 開始了
求解最大子序列和的最有效的算法
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、注釋代表個人理解有歧義請指教,謝謝