網站首頁 工作範例 辦公範例 個人範例 黨團範例 簡歷範例 學生範例 其他範例 專題範例

C筆試題演算法

欄目: 筆試題目 / 釋出於: / 人氣:6.31K

C語言能直接訪問硬體的實體地址,能進行位(bit)操作。兼有高階語言和低階語言的許多優點。下面就由本站小編為大家介紹一下C筆試題演算法的文章,歡迎閱讀。

C筆試題演算法

C筆試題演算法篇1

冒泡法:

這是最原始,也是眾所周知的最慢的演算法了。他的名字的由來因為它的工作看來象是冒泡: #include

void BubbleSort(int* pData,int Count)

{

int iTemp;

for(int i=1;i

{

for(int j=Count-1;j>=i;j--)

{

if(pData[j]

{

iTemp = pData[j-1];

pData[j-1] = pData[j];

pData[j] = iTemp;

}

}

}

}

void main

{

int data = {10,9,8,7,6,5,4};

BubbleSort(data,7);

for (int i=0;i<7;i++)

cout<

}

倒序

第一輪:10,9,8,7->10,9,7,8->10,7,9,8->7,10,9,8(交換3次)

第二輪:7,10,9,8->7,10,8,9->7,8,10,9(交換2次)

第一輪:7,8,10,9->7,8,9,10(交換1次)

迴圈次數:6次

交換次數:6次

其他:

第一輪:8,10,7,9->8,10,7,9->8,7,10,9->7,8,10,9(交換2次)

第二輪:7,8,10,9->7,8,10,9->7,8,10,9(交換0次)

第一輪:7,8,10,9->7,8,9,10(交換1次)

迴圈次數:6次

交換次數:3次

上面我們給出了程式段,現在我們分析它:這裡,影響我們演算法效能的主要部分是迴圈和交換,顯然,次數越多,效能就越差。從上面的程式我們可以看出迴圈的次數是固定的,為1+2+...+n-1。 寫成公式就是1/2*(n-1)*n。

現在注意,我們給出O方法的定義:

若存在一常量K和起點n0,使當n>=n0時,有f(n)<=K*g(n),則f(n) = O(g(n))。(呵呵,不要說沒學好數學呀,對於程式設計數學是非常重要的!!!)

現在我們來看1/2*(n-1)*n,當K=1/2,n0=1,g(n)=n*n時,1/2*(n-1)*n<=1/2*n*n=K*g(n)。所以(n)=O(g(n))=O(n*n)。所以我們程式迴圈的複雜度為O(n*n)。

再看交換。從程式後面所跟的表可以看到,兩種情況的迴圈相同,交換不同。其實交換本身同資料來源的有序程度有極大的關係,當資料處於倒序的情況時,交換次數同迴圈一樣(每次迴圈判斷都會交換),複雜度為O(n*n)。當資料為正序,將不會有交換。複雜度為O(0)。亂序時處於中間狀態。正是由於這樣的原因,我們通常都是通過迴圈次數來對比演算法。

C筆試題演算法篇2

交換法:

交換法的程式最清晰簡單,每次用當前的元素一一的同其後的元素比較並交換。

#include

void ExchangeSort(int* pData,int Count)

{

int iTemp;

for(int i=0;i

{

for(int j=i+1;j

{

if(pData[j]

{

iTemp = pData[i];

pData[i] = pData[j];

pData[j] = iTemp;

}

}

}

}

void main

{

int data = {10,9,8,7,6,5,4};

ExchangeSort(data,7);

for (int i=0;i<7;i++)

cout<

}

倒序

第一輪:10,9,8,7->9,10,8,7->8,10,9,7->7,10,9,8(交換3次)

第二輪:7,10,9,8->7,9,10,8->7,8,10,9(交換2次)

第一輪:7,8,10,9->7,8,9,10(交換1次)

迴圈次數:6次

交換次數:6次

其他:

第一輪:8,10,7,9->8,10,7,9->7,10,8,9->7,10,8,9(交換1次)

第二輪:7,10,8,9->7,8,10,9->7,8,10,9(交換1次)

第一輪:7,8,10,9->7,8,9,10(交換1次)

迴圈次數:6次

交換次數:3次

執行的表格來看,交換幾乎和冒泡一樣糟。事實確實如此。迴圈次數和冒泡一樣也是1/2*(n-1)*n,所以演算法的複雜度仍然是O(n*n)。由於我們無法給出所有的情況,所以只能直接告訴大家他們在交換上面也是一樣的糟糕(在某些情況下稍好,在某些情況下稍差)。

C筆試題演算法篇3

選擇法:

現在我們終於可以看到一點希望:選擇法,這種方法提高了一點效能(某些情況下)

這種方法類似我們人為的排序習慣:從資料中選擇最小的同第一個值交換,在從省下的部分中選擇最小的與第二個交換,這樣往復下去。

#include

void SelectSort(int* pData,int Count)

{

int iTemp;

int iPos;

for(int i=0;i

{

iTemp = pData[i];

iPos = i;

for(int j=i+1;j

{

if(pData[j]

{

iTemp = pData[j];

iPos = j;

}

}

pData[iPos] = pData[i];

pData[i] = iTemp;

}

}

void main

{

int data = {10,9,8,7,6,5,4};

SelectSort(data,7);

for (int i=0;i<7;i++)

cout<

}

倒序(最糟情況)

第一輪:10,9,8,7->(iTemp=9)10,9,8,7->(iTemp=8)10,9,8,7->(iTemp=7)7,9,8,10(交換1次) 第二輪:7,9,8,10->7,9,8,10(iTemp=8)->(iTemp=8)7,8,9,10(交換1次)

第一輪:7,8,9,10->(iTemp=9)7,8,9,10(交換0次)

迴圈次數:6次

交換次數:2次

其他:

第一輪:8,10,7,9->(iTemp=8)8,10,7,9->(iTemp=7)8,10,7,9->(iTemp=7)7,10,8,9(交換1次) 第二輪:7,10,8,9->(iTemp=8)7,10,8,9->(iTemp=8)7,8,10,9(交換1次)

第一輪:7,8,10,9->(iTemp=9)7,8,9,10(交換1次)

迴圈次數:6次

交換次數:3次

遺憾的是演算法需要的迴圈次數依然是1/2*(n-1)*n。所以演算法複雜度為O(n*n)。

我們來看他的交換。由於每次外層迴圈只產生一次交換(只有一個最小值)。所以f(n)<=n 所以我們有f(n)=O(n)。

所以,在資料較亂的時候,可以減少一定的交換次數。

Tags:筆試 演算法