C++常用排序法分析_第1頁
C++常用排序法分析_第2頁
C++常用排序法分析_第3頁
C++常用排序法分析_第4頁
C++常用排序法分析_第5頁
免費(fèi)預(yù)覽已結(jié)束,剩余5頁可下載查看

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、【W(wǎng)ord版本下載可任意編輯】 C+常用排序法分析 首先介紹一個(gè)計(jì)算時(shí)間差的函數(shù),它在 void BubbleSort(int* pData,int Count) int iTemp; for(int i=1;i=i;j-) if(pData iTemp = pData; pData = pData; pData = iTemp; void main() int data = 10,9,8,7,6,5,4; BubbleSort(data,7); for (int i=0;i10,9,7,8-10,7,9,8-7,10,9,8(交換3次) 第二輪:7,10,9,8-7,10,8,9-7,8,1

2、0,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方

3、法的定義: 若存在一常量K和起點(diǎn)n0,使當(dāng)n=n0時(shí),有f(n) void ExchangeSort(int* pData,int Count) int iTemp; for(int i=0;i9,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,

4、10,9-7,8,9,10(交換1次) 循環(huán)次數(shù):6次 交換次數(shù):3次 從運(yùn)行的表格來看,交換幾乎和冒泡一樣糟。事實(shí)確實(shí)如此。循環(huán)次數(shù)和冒泡一樣 也是1/2*(n-1)*n,所以算法的復(fù)雜度仍然是O(n*n)。由于我們無法給出所有的情況,所以 只能直接告訴大家他們?cè)诮粨Q上面也是一樣的糟糕(在某些情況下稍好,在某些情況下稍差)。 3.選擇法: 現(xiàn)在我們終于可以看到一點(diǎn)希望:選擇法,這種方法提高了一點(diǎn)性能(某些情況下) 這種方法類似我們?nèi)藶榈呐判蛄?xí)慣:從數(shù)據(jù)中選擇的同個(gè)值交換,在從省下的部分中 選擇的與第二個(gè)交換,這樣往復(fù)下去。 #include (iTemp=9)10,9,8,7-(iTemp=

5、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(

6、交換1次) 循環(huán)次數(shù):6次 交換次數(shù):3次 遺憾的是算法需要的循環(huán)次數(shù)依然是1/2*(n-1)*n。所以算法復(fù)雜度為O(n*n)。 我們來看他的交換。由于每次外層循環(huán)只產(chǎn)生交換(只有一個(gè)值)。所以f(n) void InsertSort(int* pData,int Count) int iTemp; int iPos; for(int i=1;i=0) & (iTemp pData = pData; iPos-; pData = iTemp; void main() int data = 10,9,8,7,6,5,4; InsertSort(data,7); for (int i=0;i9,

7、10,8,7(交換1次)(循環(huán)1次) 第二輪:9,10,8,7-8,9,10,7(交換1次)(循環(huán)2次) 輪:8,9,10,7-7,8,9,10(交換1次)(循環(huán)3次) 循環(huán)次數(shù):6次 交換次數(shù):3次 其他: 輪:8,10,7,9-8,10,7,9(交換0次)(循環(huán)1次) 第二輪:8,10,7,9-7,8,10,9(交換1次)(循環(huán)2次) 輪:7,8,10,9-7,8,9,10(交換1次)(循環(huán)1次) 循環(huán)次數(shù):4次 交換次數(shù):2次 上面結(jié)尾的行為分析事實(shí)上造成了一種假象,讓我們認(rèn)為這種算法是簡(jiǎn)單算法中的,其實(shí)不是, 因?yàn)槠溲h(huán)次數(shù)雖然并不固定,我們?nèi)钥梢允褂肙方法。從上面的結(jié)果可以看出,循環(huán)

8、的次數(shù)f(n) void run(int* pData,int left,int right) int i,j; int middle,iTemp; i = left; j = right; middle = pData; /求中間值 do while(pDatai),遞歸右半邊 if(righti) run(pData,i,right); void QuickSort(int* pData,int Count) run(pData,0,Count-1); void main() int data = 10,9,8,7,6,5,4; QuickSort(data,7); for (int i=

9、0;i void Bubble2Sort(int* pData,int Count) int iTemp; int left = 1; int right =Count -1; int t; do /正向的部分 for(int i=right;i=left;i-) if(pData iTemp = pData; pData = pData; pData = iTemp; t = i; left = t+1; /反向的部分 for(i=left;i int ShellPass(int * array,int d) /一趟增量為d的希爾插入排序 int temp; int k=0; for(int

10、 i=d+1;i1); cout(CMyData& data ); private: char* m_strDatamember; int m_iDataSize; ; / MyData.cpp文件 / CMyData:CMyData(): m_iIndex(0), m_iDataSize(0), m_strDatamember(NULL) CMyData:CMyData() if(m_strDatamember != NULL) delete m_strDatamember; m_strDatamember = NULL; CMyData:CMyData(int Index,char* st

11、rData): m_iIndex(Index), m_iDataSize(0), m_strDatamember(NULL) m_iDataSize = strlen(strData); m_strDatamember = new char; strcpy(m_strDatamember,strData); CMyData& CMyData:operator =(CMyData &SrcData) m_iIndex = SrcData.m_iIndex; m_iDataSize = SrcData.GetDataSize(); m_strDatamember = new char; strcp

12、y(m_strDatamember,SrcData.GetData(); return *this; bool CMyData:operator (CMyData& data ) return m_iIndexdata.m_iIndex; / / /主程序部分 #include void run(T* pData,int left,int right) int i,j; T middle,iTemp; i = left; j = right; /下面的比較都調(diào)用我們重載的操作符函數(shù) middle = pData; /求中間值 do while(pDatai),遞歸右半邊 if(righti) run(pData,i,right); template void QuickSort(T* pData,int Count) run(pData,0,Count-1); void main() CMyData data = CMyData(8,xulion), CMyData(7,sanzoo), CMyDa

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論