C筆試題算法
C語言能直接訪問硬件的物理地址,能進(jìn)行位(bit)操作。兼有高級語言和低級語言的許多優(yōu)點。下面就由學(xué)習(xí)啦小編為大家介紹一下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次)
循環(huán)次數(shù):6次
交換次數(shù):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次)
循環(huán)次數(shù):6次
交換次數(shù):3次
上面我們給出了程序段,現(xiàn)在我們分析它:這里,影響我們算法性能的主要部分是循環(huán)和交換,顯然,次數(shù)越多,性能就越差。從上面的程序我們可以看出循環(huán)的次數(shù)是固定的,為1+2+...+n-1。 寫成公式就是1/2*(n-1)*n。
現(xiàn)在注意,我們給出O方法的定義:
若存在一常量K和起點n0,使當(dāng)n>=n0時,有f(n)<=K*g(n),則f(n) = O(g(n))。(呵呵,不要說沒學(xué)好數(shù)學(xué)呀,對于編程數(shù)學(xué)是非常重要的!!!)
現(xiàn)在我們來看1/2*(n-1)*n,當(dāng)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)。所以我們程序循環(huán)的復(fù)雜度為O(n*n)。
再看交換。從程序后面所跟的表可以看到,兩種情況的循環(huán)相同,交換不同。其實交換本身同數(shù)據(jù)源的有序程度有極大的關(guān)系,當(dāng)數(shù)據(jù)處于倒序的情況時,交換次數(shù)同循環(huán)一樣(每次循環(huán)判斷都會交換),復(fù)雜度為O(n*n)。當(dāng)數(shù)據(jù)為正序,將不會有交換。復(fù)雜度為O(0)。亂序時處于中間狀態(tài)。正是由于這樣的原因,我們通常都是通過循環(huán)次數(shù)來對比算法。
C筆試題算法篇2
交換法:
交換法的程序最清晰簡單,每次用當(dāng)前的元素一一的同其后的元素比較并交換。
#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次)
循環(huán)次數(shù):6次
交換次數(shù):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次)
循環(huán)次數(shù):6次
交換次數(shù):3次
從運行的表格來看,交換幾乎和冒泡一樣糟。事實確實如此。循環(huán)次數(shù)和冒泡一樣也是1/2*(n-1)*n,所以算法的復(fù)雜度仍然是O(n*n)。由于我們無法給出所有的情況,所以只能直接告訴大家他們在交換上面也是一樣的糟糕(在某些情況下稍好,在某些情況下稍差)。
C筆試題算法篇3
選擇法:
現(xiàn)在我們終于可以看到一點希望:選擇法,這種方法提高了一點性能(某些情況下)
這種方法類似我們?nèi)藶榈呐判蛄?xí)慣:從數(shù)據(jù)中選擇最小的同第一個值交換,在從省下的部分中選擇最小的與第二個交換,這樣往復(fù)下去。
#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次)
循環(huán)次數(shù):6次
交換次數(shù):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次)
循環(huán)次數(shù):6次
交換次數(shù):3次
遺憾的是算法需要的循環(huán)次數(shù)依然是1/2*(n-1)*n。所以算法復(fù)雜度為O(n*n)。
我們來看他的交換。由于每次外層循環(huán)只產(chǎn)生一次交換(只有一個最小值)。所以f(n)<=n 所以我們有f(n)=O(n)。
所以,在數(shù)據(jù)較亂的時候,可以減少一定的交換次數(shù)。