C語言常用演算法大全

2021-03-04 00:53:12 字數 2819 閱讀 7226

1、非數值計算常用經典演算法

1.窮舉

也稱為「列舉法」,即將可能出現的每一種情況一一測試,判斷是否滿足條件,一般採用迴圈來實現。

例1、用窮舉法輸出所有的水仙花數(即這樣的三位正整數:其每位數字上的數字的立方和與該數相等,比如:13+53+33=153)。

[法一]

main()

}【解析】此方法是將100到999所有的三位正整數一一考察,即將每乙個三位正整數的個位數、十位數、百位數一一求出(各數字上的數字的提取演算法見下面的「數字處理」),算出三者的立方和,一旦與原數相等就輸出。共考慮了900個三位正整數。

[法二]

main()

【解析】此方法是用1到9做百位數字、0到9做十位和個位數字,將組成的三位正整數與每一組的三個數的立方和進行比較,一旦相等就輸出。共考慮了900個組合(外迴圈單獨執行的次數為9,兩個內迴圈單獨執行的次數分別為10次,故if語句被執行的次數為9×10×10=900),即900個三位正整數。與法一判斷的次數一樣。

2.排序

(1)氣泡排序(起泡排序)

假設要對含有n個數的序列進行公升序排列,氣泡排序演算法步驟是:

①從存放序列的陣列中的第乙個元素開始到最後乙個元素,依次對相鄰兩數進行比較,若前者大後者小,則交換兩數的位置;

②第①趟結束後,最大數就存放到陣列的最後乙個元素裡了,然後從第乙個元素開始到倒數第二個元素,依次對相鄰兩數進行比較,若前者大後者小,則交換兩數的位置;

③重複步驟①n-1趟,每趟比前一趟少比較一次,即可完成所求。

例1、任意讀入10個整數,將其用冒泡法按公升序排列後輸出。

#define n 10

main()

for(i=0;i(2)選擇法排序

選擇法排序是相對好理解的排序演算法。假設要對含有n個數的序列進行公升序排列,演算法步驟是:

①從陣列存放的n個數中找出最小數的下標(演算法見下面的「求最值」),然後將最小數與第1個數交換位置;

②除第1個數以外,再從其餘n-1個數中找出最小數(即n個數中的次小數)的下標,將此數與第2個數交換位置;

③重複步驟①n-1趟,即可完成所求。

例1、任意讀入10個整數,將其用選擇法按公升序排列後輸出。

#define n 10

main()

}for(i=0;i printf("%d\n",a[i]); }

(3)插入法排序

要想很好地掌握此演算法,先請了解「有序序列的插入演算法」,就是將某資料插入到乙個有序序列後,該序列仍然有序。插入演算法參見下面的「陣列元素的插入」。

例1、將任意讀入的整數x插入一公升序數列後,數列仍按公升序排列。

#define n 10

main()

,x,j,k; /*注意留乙個空間給待插數*/

scanf("%d",&x);

if(x>a[n-2]) a[n-1]=x ; /*比最後乙個數還大就往最後乙個元素中存放*/

else /*查詢待插位置*/

for(j=0;j<=n-1;j++) printf("%d ",a[j]);

}插入法排序的要領就是每讀入乙個數立即插入到最終存放的陣列中,每次插入都使得該陣列有序。

例2、任意讀入10個整數,將其用插入法按降序排列後輸出。

#define n 10

main()

} for(i=0;i}

(4)歸併排序

即將兩個都公升序(或降序)排列的資料序列合併成乙個仍按原序排列的序列。

例1、有乙個含有6個資料的公升序序列和乙個含有4個資料的公升序序列,將二者合併成乙個含有10個資料的公升序序列。

#define m 6

#define n 4

main()

,b[n]=;

int i,j,k,c[m+n];

i=j=k=0;

while(i

k++; }

while(i>=m && j

while(j>=n && i

for(i=0;i}

3.查詢

(1)順序查詢(即線性查詢)

順序查詢的思路是:將待查詢的量與陣列中的每乙個元素進行比較,若有乙個元素與之相等則找到;若沒有乙個元素與之相等則找不到。

例1、任意讀入10個數存放到陣列a中,然後讀入待查詢數值,存放到x中,判斷a中有無與x等值的數。

#define n 10

main()

(2)折半查詢(即二分法)

順序查詢的效率較低,當資料很多時,用二分法查詢可以提高效率。使用二分法查詢的前提是數列必須有序。

二分法查詢的思路是:要查詢的關鍵值同陣列的中間乙個元素比較,若相同則查詢成功,結束;否則判別關鍵值落在陣列的哪半部分,就在這半部分中按上述方法繼續比較,直到找到或陣列中沒有這樣的元素值為止。

例1、任意讀入乙個整數x,在公升序陣列a中查詢是否有與x等值的元素。

#define n 10

main()

; int x,high,low,mid;/*x為關鍵值*/

scanf("%d",&x);

high=n-1; low=0; mid=(high+low)/2;

while(a[mid]!=x&&low

if(x==a[mid]) printf("found %d,%d\n",x,mid);

else printf("not found\n");

}三、數值計算常用經典演算法:

1.級數計算

級數計算的關鍵是「描述出通項」,而通項的描述法有兩種:一為直接法、二為間接法又稱遞推法。

直接法的要領是:利用項次直接寫出通項式;遞推法的要領是:利用前乙個(或多個)通項寫出後乙個通項。

可以用直接法描述通項的級數計算例子有:

(1)1+2+3+4+5+……

C語言常用演算法歸納

交換 累加 累乘 窮舉 排序 冒泡,選擇 查詢 順序即線性 級數計算 直接 簡接即遞推 一元非線性方程求根 牛頓迭代法 二分法 定積分計算 矩形法 梯形法 迭代 進製轉換 矩陣轉置 字元處理 統計 數字串 字母大小寫轉換 加密等 整數各數字上數字的獲取 輾轉相除法求最大公約數 最小公倍數 求最值 判...

C語言常用而經典的演算法

一 基本演算法交換 累加 累乘 二 非數值計算常用經典演算法窮舉 排序冒泡選擇 查詢順序即線性 三 數值計算常用經典演算法級數計算直接 簡接即遞推 一元非線性方程求根牛頓迭代法 二分法 定積分計算矩形法 梯形法 矩陣轉置 四 其他迭代 進製轉換 字元處理統計 數字串 字母大小寫轉換 加密等 整數各數...

matlab常用演算法大全

matlab 高階演算法程式 彙總 renkou1 renkou 1 年末常住人口數 renkou2 renkou 2 戶籍人口 renkou3 renkou 3 非戶籍人口 shjian 1979 2010 以上資料自己給 x0 renkou2 n length x0 lamda x0 1 n 1...