程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> 基於C語言的算法總結(不定時更新),c語言算法定時更新

基於C語言的算法總結(不定時更新),c語言算法定時更新

編輯:關於C語言

基於C語言的算法總結(不定時更新),c語言算法定時更新


這篇博客我准備寫一些我見過的算法,雖然現在我見過的還很少,但我相信會越來越多,方便日後自己查閱

好了 開始了

求解最大子序列和的最有效的算法

 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、注釋代表個人理解有歧義請指教,謝謝

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved