常用演算法(C版)

2021-06-18 05:48:42 字數 3961 閱讀 7192

演算法(algorithm):計算機解題的基本思想方法和步驟。演算法的描述:是對要解決乙個問題或要完成一項任務所採取的方法和步驟的描述,包括需要什麼資料(輸入什麼資料、輸出什麼結果)、採用什麼結構、使用什麼語句以及如何安排這些語句等。通常使用自然語言、結構化流程圖、偽**等來描述演算法。

一、計數、求和、求階乘等簡單演算法

此類問題都要使用迴圈,要注意根據問題確定迴圈變數的初值、終值或結束條件,更要注意用來表示計數、和、階乘的變數的初值。

例:用隨機函式產生100個[0,99]範圍內的隨機整數,統計個位上的數字分別為1,2,3,4,5,6,7,8,9,0的數的個數並列印出來。

本題使用陣列來處理,用陣列a[100]存放產生的確100個隨機整數,陣列x[10]來存放個位上的數字分別為1,2,3,4,5,6,7,8,9,0的數的個數。即個位是1的個數存放在x[1]中,個位是2的個數存放在x[2]中,……個位是0的個數存放在x[10]。

void main()

for(i=1;i<=100;i++)

for(i=1;i<=10;i++)

printf("/n");

} 二、求兩個整數的最大公約數、最小公倍數

分析:求最大公約數的演算法思想:(最小公倍數=兩個整數之積/最大公約數)

(1) 對於已知兩數m,n,使得m>n;

(2) m除以n得餘數r;

(3) 若r=0,則n為求得的最大公約數,演算法結束;否則執行(4);

(4) m←n,n←r,再重複執行(2)。

例如: 求 m=14 ,n=6 的最大公約數. m n r

14 6 2

6 2 0

void main()

將其寫成一函式,若為素數返回1,不是則返回0

int prime( m%)

main() }

五、排序問題

1.選擇法排序(公升序)

基本思想:

1)對有n個數的序列(存放在陣列a(n)中),從中選出最小的數,與第1個數交換位置;

2)除第1 個數外,其餘n-1個數中選最小的數,與第2個數交換位置;

3)依次類推,選擇了n-1次後,這個數列已按公升序排列。

程式**如下:

void main()

printf("%d/n",a[i]);

} }

2.冒泡法排序(公升序)

基本思想:(將相鄰兩個數比較,小的調到前頭)

1)有n個數(存放在陣列a(n)中),第一趟將每相鄰兩個數比較,小的調到前頭,經n-1次兩兩相鄰比較後,最大的數已「沉底」,放在最後乙個位置,小數上公升「浮起」;

2)第二趟對餘下的n-1個數(最大的數已「沉底」)按上法比較,經n-2次兩兩相鄰比較後得次大的數;

3)依次類推,n個數共進行n-1趟比較,在第j趟中要進行n-j次兩兩比較。

程式段如下

void main()

printf("the sorted numbers:/n");

for(i=0;i<10;i++)

printf("%d/n",a[i]);

} 3.合併法排序(將兩個有序陣列a、b合併成另乙個有序的陣列c,公升序)

基本思想:

1)先在a、b陣列中各取第乙個元素進行比較,將小的元素放入c陣列;

2)取小的元素所在陣列的下乙個元素與另一陣列中上次比較後較大的元素比較,重複上述比較過程,直到某個陣列被先排完;

3)將另乙個陣列剩餘元素抄入c陣列,合併排序完成。

程式段如下:

void main()

思考:將上面程式改寫一查詢函式find,若找到則返回下標值,找不到返回-1

②基本思想:一列數放在陣列a[1]---a[n]中,待查詢的關鍵值為key,把key與a陣列中的元素從頭到尾一一進行比較查詢,若相同,查詢成功,若找不到,則查詢失敗。(查詢子過程如下。index:存放找到元素的下標。)

void main()

if(index==-1)

printf("the number is not found!/n");

else

printf("the number is found the no%d!/n",index);

} 2.折半查詢法(只能對有序數列進行查詢)

基本思想:設n個有序數(從小到大)存放在陣列a[1]----a[n]中,要查詢的數為x。用變數bot、top、mid 分別表示查詢資料範圍的底部(陣列下界)、頂部(陣列的上界)和中間,mid=(top+bot)/2,折半查詢的演算法如下:

(1)x=a(mid),則已找到退出迴圈,否則進行下面的判斷;

(2)xa(mid),x必定落在mid+1和top的範圍之內,即bot=mid+1;

(4)在確定了新的查詢範圍後,重複進行以上比較,直到找到或者bot<=top。

將上面的演算法寫成如下程式:

void main()

main()

, x, i;

for(i=0; i

float fsqrt(float a)

while(fabs(x1-x0)>0.00001);

return(x1);

} main()

十、數制轉換

將乙個十進位制整數m轉換成 →r(2-16)進製字串。

方法:將m不斷除 r 取餘數,直到商為零,以反序得到結果。下面寫出一轉換函式,引數idec為十進位制數,ibase為要轉換成數的基(如二進位制的基是2,八進位制的基是8等),函式輸出結果是字串。

char *trdec(int idec, int ibase)

for(i=0; i

char *jiami(char stri)

else if(stri[i]>=』a』&&stri[i]<=』z』)

else ia=stri[i];

strp[i++]=ia;

} strp[i]=』/0』;

return(strp);

} main()

2.統計文字單詞的個數

輸入一行字元,統計其中有多少個單詞,單詞之間用格分隔開。

演算法思路:

(1)從文字(字串)的左邊開始,取出乙個字元;設邏輯量word表示所取字元是否是單詞內的字元,初值設為0

(2)若所取字元不是「空格」,「逗號」,「分號」或「感嘆號」等單詞的分隔符,再判斷word是否為1,若word不為1則表是新單詞的開始,讓單詞數num = num +1,讓word =1;

(3)若所取字元是「空格」,「逗號」,「分號」或「感嘆號」等單詞的分隔符, 則表示字元不是單詞內字元,讓word=0;

(4) 再依次取下乙個字元,重得(2)(3)直到文字結束。

下面程式段是字串string中包含的單詞數

#include "stdio.h"

main()

printf("there are %d word in the line./n",num); } 十

二、窮舉法

窮舉法(又稱「列舉法」)的基本思想是:一一枚舉各種可能的情況,並判斷哪一種可能是符合要求的解,這是一種「在沒有其它辦法的情況的方法」,是一種最「笨」的方法,然而對一些無法用解析法求解的問題往往能奏效,通常採用迴圈來處理窮舉問題。

例: 將一張面值為100元的人民幣等值換成100張5元、1元和0.5元的零鈔,要求每種零鈔不少於1張,問有哪幾種組合?

main() }

十三、遞迴演算法

用自身的結構來描述自身,稱遞迴

vb允許在乙個sub子過程和function過程的定義內部呼叫自己,即遞迴sub子過程和遞迴function函式。遞迴處理一般用棧來實現,每呼叫一次自身,把當前引數壓棧,直到遞迴結束條件;然後從棧中彈出當前引數,直到棧空。

遞迴條件:(1)遞迴結束條件及結束時的值;(2)能用遞迴形式表示,且遞迴向終止條件發展。

例:編fac(n)=n! 的遞迴函式

int fac(int n)

main()

C 版 常用排序演算法。

1 個人學習記錄。2 大佬請繞道。using system.collections using system.collections.generic using unityengine namespace datastructure.wcc region 穩定排序 歸併排序 氣泡排序 插入排序。re...

PHP版常用演算法

最近準備面試的資料,順便整理一下以前的基本演算法,寫個demo記錄一下 冒泡 冒泡 逐行對比,滿足條件則交換 function bubblesort arrdata,sort desc if issorted break return arrdata 快速排序 快速排序 選取乙個標準,和其他資料對比...

常用排序演算法(java版)

概述 1 插入排序 直接插入排序 希爾排序 2 交換排序 氣泡排序 快速排序 3 選擇排序 直接選擇排序 堆排序 4 歸併排序 5 分配排序 基數排序 所需輔助空間最多 歸併排序 所需輔助空間最少 堆排序 平均速度最快 快速排序 不穩定 快速排序,希爾排序,堆排序。當n較大,則應採用時間複雜度為o ...