課程設(shè)計報告----內(nèi)排序算法比較_第1頁
已閱讀1頁,還剩5頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、<p>  《數(shù)據(jù)結(jié)構(gòu)》課程設(shè)計報告</p><p><b>  程序清單:</b></p><p> 提交日期: 8月20日 成績: 指導(dǎo)老師:</p><p> 實驗題目: 內(nèi)排序算法比較</p><p> 問題解析(對問題的分析、理解和解題方法):

2、偽隨機數(shù)的產(chǎn)生是由 time. h 頭文件,以rand(time(0))為隨機種子的函數(shù)rand()產(chǎn)生,可以保持?jǐn)?shù)據(jù)的無序性。生成三種文件,分別保存正序.逆序.和隨機產(chǎn)生的數(shù)據(jù),并在程序執(zhí)行過程中可選擇用某一文件中的數(shù)據(jù)。用類涵蓋六種排序算法的內(nèi)部操作,并定義數(shù)組元素類。輸入以文件的方式來進(jìn)行,必須保證對六種排序算法的輸入數(shù)據(jù)是一樣且連續(xù)的。對于比較次數(shù)的統(tǒng)計加在比較判斷的前邊,在判斷失敗時也能統(tǒng)計到比較次數(shù)。對于存在遞歸的快速排序和

3、存在子函數(shù)的堆排序的比較次數(shù).移動次數(shù)統(tǒng)計采用以引用做函數(shù)參數(shù)。</p><p> 數(shù)據(jù)結(jié)構(gòu)選擇:選用動態(tài)數(shù)組為內(nèi)部基本運算結(jié)構(gòu),外部數(shù)據(jù)選用文件。算法設(shè)計:構(gòu)建動態(tài)數(shù)組元素類,六種排序操作.輸出操作為該類的函數(shù),輸入操作包含在構(gòu)造函數(shù)中。需求分析:外部數(shù)據(jù)只可以手動輸入隨機數(shù)的個數(shù)。程序運行中可選擇采用多種文件用各種算法測試多次。程序主線:產(chǎn)生正序文件f1.txt,倒序文件f2.txt,并生成三個隨機文件f3.

4、txt f4.txt f5.txt。選擇將某一文件導(dǎo)入程序,進(jìn)行排序,并測試各種算法的移動和比較次數(shù)。最后對結(jié)果進(jìn)行分析。</p><p> 任務(wù)分工、進(jìn)度計劃:周一:六種排序算法嵌入各主程序,并進(jìn)行初步測算。周二:主要解決程序文件輸入,輸出問題和各函數(shù)的接口問題。周三:對程序進(jìn)行調(diào)整,解決部分錯誤輸出。</p><p> 用戶手冊: 用戶需要選擇是否生成新的文件,還需要外部輸入待排序

5、數(shù)組元素個數(shù)即可,程序運行中用戶可選擇用某一文件進(jìn)行排序。</p><p> 測試結(jié)果:請輸入排序元素個數(shù):10000請輸入讀入何種待排序文件:(0:正序 1:逆序 2:隨機文件1 3:隨機文件2 4:隨機文件3)0Bubble:比較次數(shù)=9999 移動次數(shù):=0InsertSort:比較次數(shù)=9999 移動次數(shù):=19998SSort:比較次數(shù)=49995000 移動次數(shù):=29997QSort:比較次

6、數(shù)=19998 移動次數(shù):=39996ShellSort:比較次數(shù)=120009 移動次數(shù):=240018HeapSort:比較次數(shù)=264502 移動次數(shù):=394251是否繼續(xù)測試:(按任意鍵繼續(xù),按0退出:)1請輸入排序元素個數(shù):10000請輸入讀入何種待排序文件:(0:正序 1:逆序 2:隨機文件1 3:隨機文件2 4:隨機文件3)1Bubble:比較次數(shù)=49995000 移動次數(shù):=149985000InsertSo

7、rt:比較次數(shù)=9999 移動次數(shù):=19998SSort:比較次數(shù)=49995000 移動次數(shù):=29997QSort:比較次數(shù)=19998 移動次數(shù):=39996ShellSort:比較次數(shù)=120009 移動次數(shù):=</p><p> 總結(jié)(對所做程序進(jìn)行分析、評價運行結(jié)果、總結(jié)遇到的問題及解決辦法):總結(jié):能輸出各種算法對同一數(shù)組的比較.交換次數(shù),能較直觀的比較各種算法在不同情況下的優(yōu)劣。遇到如下問題:問

8、題1:快速排序的遞歸中和堆排序的子函數(shù)中比較次數(shù)和移動次數(shù)無法同時返回解決辦法:引用比較次數(shù)compare和移動次數(shù)move作為函數(shù)的參數(shù)。問題2:在數(shù)組很大>10000,正序或逆序時,快速排序堆棧溢出解決辦法:在編譯器中修改了堆棧上限。</p><p>  #include<iostream></p><p>  #include<ctime></p&

9、gt;<p>  #include<fstream></p><p>  using namespace std;</p><p>  class lists{</p><p><b>  public:</b></p><p><b>  int n;</b></p

10、><p>  void savefile();</p><p><b>  lists();</b></p><p>  int getlist(int n){return list[n];}</p><p>  void output();</p><p>  void Bubble();</

11、p><p>  void InsertSort();</p><p>  void SSort();</p><p>  void QQSort(int m,int n,int &,int &);</p><p>  void QSort();</p><p>  void ShellSort();<

12、/p><p>  void Restore(int *tree,const int root,const int n,int &,int &);</p><p>  void HeapSort();</p><p><b>  private:</b></p><p>  int *list;</p&g

13、t;<p><b>  };</b></p><p>  lists::lists(){</p><p><b>  int s0;</b></p><p>  savefile();</p><p>  cout<<"請輸入讀入何種待排序文件:(0:正序 1:

14、逆序 2:隨機文件1 3:隨機文件2 4:隨機文件3)"<<endl;</p><p><b>  cin>>s0;</b></p><p>  list=new int[n];</p><p>  switch(s0){</p><p>  case 0:{ifstream in

15、file("f1.txt",ios::in);</p><p>  for(int i=0;i<n;i++)infile>>list[i];</p><p>  infile.close();break;}</p><p>  case 1:{ifstream infile("f2.txt",ios::in)

16、;</p><p>  for(int i=0;i<n;i++)infile>>list[i];</p><p>  infile.close();break;}</p><p>  case 2:{ifstream infile("f3.txt",ios::in);</p><p>  for(int

17、i=0;i<n;i++)infile>>list[i];</p><p>  infile.close();break;}</p><p>  case 3:{ifstream infile("f4.txt",ios::in);</p><p>  for(int i=0;i<n;i++)infile>>lis

18、t[i];</p><p>  infile.close();break;}</p><p>  case 4:{ifstream infile("f5.txt",ios::in);</p><p>  for(int i=0;i<n;i++)infile>>list[i];</p><p>  infi

19、le.close();break;}</p><p><b>  }</b></p><p><b>  }</b></p><p>  void lists::output(){</p><p>  for(int i=0;i<n;i++)</p><p>  cou

20、t<<list[i]<<endl;</p><p><b>  }</b></p><p><b>  //冒泡排序</b></p><p>  void lists::Bubble(){</p><p>  int bound,j,t;</p><p&g

21、t;<b>  int e;</b></p><p>  int compare=0,move=0;</p><p>  bound=n-1;</p><p>  while(bound){</p><p><b>  t=0;</b></p><p>  for(j=0;j

22、<bound;j++){</p><p>  compare++;</p><p>  if(list[j]>list[j+1]){</p><p><b>  move+=3;</b></p><p>  e=list[j];</p><p>  list[j]=list[j+1];

23、</p><p>  list[j+1]=e;</p><p><b>  t=j;</b></p><p><b>  }</b></p><p><b>  }</b></p><p><b>  bound=t;</b><

24、;/p><p><b>  }</b></p><p>  cout<<"Bubble:比較次數(shù)="<<compare<<" 移動次數(shù):="<<move<<endl;</p><p><b>  }</b></p>

25、<p><b>  //直接插入排序</b></p><p>  void lists::InsertSort(){</p><p><b>  int e,i;</b></p><p>  int compare=0,move=0;</p><p>  //list[-1]=0;&l

26、t;/p><p>  for(int j=1;j<n;j++){</p><p>  e=list[j];</p><p><b>  move++;</b></p><p><b>  i=j-1;</b></p><p>  compare++;</p>

27、<p>  while(e<list[i]){</p><p>  list[i+1]=list[i];</p><p><b>  move++;</b></p><p><b>  i--;</b></p><p><b>  }</b></p>

28、<p>  list[i+1]=e;</p><p><b>  move++;</b></p><p><b>  }</b></p><p>  cout<<"InsertSort:比較次數(shù)="<<compare<<" 移動次數(shù):=&quo

29、t;<<move<<endl;</p><p><b>  }</b></p><p><b>  //直接選擇排序</b></p><p>  void lists::SSort(){</p><p><b>  int t;</b></p>

30、;<p><b>  int e;</b></p><p>  int compare=0,move=0;</p><p>  for(int j=n-1;j>=1;j--){</p><p><b>  t=0;</b></p><p>  for(int i=1;i<=

31、j;i++){</p><p>  compare++;</p><p>  if(list[t]<list[i])</p><p><b>  t=i;</b></p><p><b>  }</b></p><p>  e=list[t];</p>&

32、lt;p>  list[t]=list[j];</p><p>  list[j]=e;</p><p><b>  move+=3;</b></p><p><b>  }</b></p><p>  cout<<"SSort:比較次數(shù)="<<co

33、mpare<<" 移動次數(shù):="<<move<<endl;</p><p><b>  }</b></p><p><b>  //快速排序</b></p><p>  void lists::QQSort(int m,int n,int &a,int &am

34、p;b){</p><p>  int i,j,k,temp;</p><p><b>  if(m<n){</b></p><p><b>  i=m;</b></p><p><b>  j=n+1;</b></p><p>  k=list[

35、m];</p><p><b>  b++;</b></p><p>  while(i<j){</p><p><b>  i++;</b></p><p><b>  a++;</b></p><p>  while(list[i]<k)

36、i++;</p><p><b>  j--;</b></p><p><b>  a++;</b></p><p>  while(list[j]>k)j--;</p><p><b>  if(i<j){</b></p><p>  te

37、mp=list[i];</p><p>  list[i]=list[j];</p><p>  list[j]=temp;</p><p><b>  b+=3;</b></p><p><b>  }</b></p><p><b>  }</b>&

38、lt;/p><p>  temp=list[m];</p><p>  list[m]=list[j];</p><p>  list[j]=temp;</p><p><b>  b+=3;</b></p><p>  QQSort(m,j-1,a,b);</p><p> 

39、 QQSort(j+1,n,a,b);</p><p><b>  }</b></p><p><b>  }</b></p><p><b>  //快速排序</b></p><p>  void lists::QSort(){</p><p>  i

40、nt compare=0,move=0;</p><p>  QQSort(0,n-1,compare,move);</p><p>  cout<<"QSort:比較次數(shù)="<<compare<<" 移動次數(shù):="<<move<<endl;</p><p><

41、b>  }</b></p><p><b>  //希爾排序</b></p><p>  void lists::ShellSort(){</p><p>  int gap=n-1;</p><p><b>  int i;</b></p><p>  i

42、nt compare=0,move=0;</p><p>  while(gap>=1){</p><p>  gap=gap/2;</p><p>  for(i=0;i<gap;i++){</p><p><b>  int e;</b></p><p><b>  in

43、t t;</b></p><p>  for(int j=i+gap;j<n;j=j+gap){</p><p>  e=list[j];</p><p><b>  t=j-gap;</b></p><p><b>  move++;</b></p><p&g

44、t;  compare++;</p><p>  while(e<list[t]){</p><p>  list[t+gap]=list[t];</p><p><b>  t=t-gap;</b></p><p><b>  move++;</b></p><p>

45、  if(t<=i)break;</p><p><b>  }</b></p><p>  list[t+gap]=e;</p><p><b>  move++;</b></p><p><b>  }</b></p><p><b>

46、;  }</b></p><p><b>  }</b></p><p>  cout<<"ShellSort:比較次數(shù)="<<compare<<" 移動次數(shù):="<<move<<endl;</p><p><b>  }&

47、lt;/b></p><p><b>  //重建堆</b></p><p>  void lists::Restore(int *tree,const int root,const int n,int &a,int &b){</p><p><b>  int m,e;</b></p>

48、<p>  int j=root;</p><p>  while(j<=n/2-1){</p><p><b>  a++;</b></p><p>  if((2*j<n-1)&&(tree[2*j]<tree[2*j+1]))m=2*j+1;</p><p>  els

49、e m=2*j;</p><p><b>  a++;</b></p><p>  if(tree[j]<tree[m]){</p><p><b>  b+=3;</b></p><p>  e=tree[j];</p><p>  tree[j]=tree[m];&

50、lt;/p><p>  tree[m]=e;</p><p><b>  j=m;</b></p><p><b>  }</b></p><p>  else j=n-1;</p><p><b>  }</b></p><p>&

51、lt;b>  }</b></p><p>  void lists::HeapSort(){</p><p><b>  int i,e;</b></p><p>  int compare=0,move=0;</p><p>  for(i=(n-1)/2;i>=0;i--)</p>

52、<p>  Restore(list,i,n,compare,move);</p><p>  for(i=n-1;i>0;i--){</p><p>  e=list[i];</p><p>  list[i]=list[0];</p><p>  list[0]=e;</p><p>  Res

53、tore(list,0,i,compare,move);</p><p><b>  }</b></p><p>  cout<<"HeapSort:比較次數(shù)="<<compare<<" 移動次數(shù):="<<move<<endl;</p><p>

54、<b>  }</b></p><p>  void lists::savefile(){</p><p><b>  int i;</b></p><p>  srand(time(0));</p><p>  cout<<"請輸入排序元素個數(shù):"<<e

55、ndl;</p><p><b>  cin>>n;</b></p><p>  list=new int[n];</p><p>  ofstream outfile1("f1.txt",ios::out);</p><p>  for(i=0;i<n;i++){</p>

56、;<p>  list[i]=i+1;</p><p>  outfile1<<list[i]<<endl;</p><p>  }outfile1.close();</p><p>  ofstream outfile2("f2.txt",ios::out);</p><p>  f

57、or(i=0;i<n;i++){</p><p>  list[i]=n-i;</p><p>  outfile2<<list[i]<<endl;</p><p>  }outfile2.close();</p><p>  ofstream outfile3("f3.txt",ios::o

58、ut);</p><p>  for(i=0;i<n;i++){</p><p>  list[i]=rand()%10000+1;</p><p>  outfile3<<list[i]<<endl;</p><p>  }outfile3.close();</p><p>  ofst

59、ream outfile4("f4.txt",ios::out);</p><p>  for(i=0;i<n;i++){</p><p>  list[i]=rand()%10000+1;</p><p>  outfile4<<list[i]<<endl;</p><p>  }outfi

60、le4.close();</p><p>  ofstream outfile5("f5.txt",ios::out);</p><p>  for(i=0;i<n;i++){</p><p>  list[i]=rand()%10000+1;</p><p>  outfile5<<list[i]<

61、;<endl;</p><p>  }outfile5.close();</p><p><b>  }</b></p><p>  #include<iostream></p><p>  #include"排序.h"</p><p>  using nam

62、espace std;</p><p>  int sort(){</p><p>  class lists a_list;</p><p>  //cout<<"排序前:"<<endl;</p><p>  //a_list.output();</p><p>  a

63、_list.Bubble();</p><p>  a_list.InsertSort();</p><p>  a_list.SSort();</p><p>  a_list.QSort();</p><p>  a_list.ShellSort();</p><p>  a_list.HeapSort();<

64、;/p><p>  //cout<<"排序后:"<<endl;</p><p>  //a_list.output();</p><p><b>  return 0;</b></p><p><b>  }</b></p><p>

65、;  int main(){</p><p><b>  int flag;</b></p><p><b>  do{</b></p><p><b>  sort();</b></p><p>  cout<<"是否繼續(xù)測試:(按任意鍵繼續(xù),按0退出:

溫馨提示

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

評論

0/150

提交評論