單獨(dú)實(shí)現(xiàn)各種排序 課程設(shè)計(jì)報(bào)告_第1頁(yè)
已閱讀1頁(yè),還剩32頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、<p>  數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)設(shè)計(jì)報(bào)告</p><p><b>  課程設(shè)計(jì)題目</b></p><p>  單獨(dú)實(shí)現(xiàn)各種排序 </p><p>  2013 年 5 月 4 日</p><p><b>  目錄</b></p><p><b>  ?

2、 目錄1</b></p><p><b>  ? 需求分析3</b></p><p><b>  ? 概要設(shè)計(jì)4</b></p><p>  ? 直接插入排序的設(shè)計(jì)思路4</p><p>  ? 折半插入排序的設(shè)計(jì)思路4</p><p>  ? 希爾排序

3、的設(shè)計(jì)思路5</p><p>  ? 冒泡排序設(shè)計(jì)思路5</p><p>  ? 快速排序設(shè)計(jì)思路5</p><p>  ? 直接選擇排序的設(shè)計(jì)思路6</p><p>  ? 堆排序的設(shè)計(jì)思路6</p><p>  ? 歸并排序的設(shè)計(jì)思路8</p><p>  ? 基數(shù)排序的設(shè)計(jì)思路

4、9</p><p><b>  ? 詳細(xì)設(shè)計(jì)11</b></p><p>  ? 直接插入排序11</p><p>  ? 折半插入排序12</p><p><b>  ? 希爾排序13</b></p><p><b>  ? 冒泡排序15</b&

5、gt;</p><p><b>  ? 快速排序16</b></p><p>  ? 直接選擇排序17</p><p><b>  ? 堆排序18</b></p><p><b>  ? 歸并排序20</b></p><p><b> 

6、 ? 基數(shù)排序22</b></p><p><b>  ? 調(diào)試分析25</b></p><p>  ? 直接插入排序25</p><p>  ? 折半插入排序26</p><p><b>  ? 希爾排序27</b></p><p><b>

7、  ? 冒泡排序27</b></p><p><b>  ? 快速排序28</b></p><p>  ? 直接選擇排序28</p><p><b>  ? 堆排序29</b></p><p><b>  ? 歸并排序29</b></p>&

8、lt;p><b>  ? 基數(shù)排序30</b></p><p>  ? 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)總結(jié)31</p><p>  ? 課程設(shè)計(jì)的收獲31</p><p>  ? 遇到的問(wèn)題及解決思路32</p><p>  ? 對(duì)數(shù)據(jù)結(jié)構(gòu)課程的思考32</p><p><b>  ?

9、 參考文獻(xiàn)33</b></p><p><b>  需求分析</b></p><p>  排序時(shí)計(jì)算機(jī)程序設(shè)計(jì)中一種重要的操作,它的功能將包含多個(gè)數(shù)據(jù)元素的任意序列,重新排列成一個(gè)按關(guān)鍵字有序的序列。</p><p>  由于待排序的元素?cái)?shù)量不同,使得排序過(guò)程中的時(shí)空開(kāi)銷也不同。沒(méi)有一種排序算法可以適合任何一種場(chǎng)合,每種排序算法都

10、有適合的特殊環(huán)境,只有在這種特殊環(huán)境中才能發(fā)揮這種排序算法的優(yōu)勢(shì)。</p><p>  排序在很多的場(chǎng)合都會(huì)用到,一個(gè)優(yōu)秀的排序算法可以使程序的運(yùn)行效率提高,節(jié)約時(shí)空資源。</p><p>  其中對(duì)整數(shù)或者是實(shí)數(shù)的排序用得最多,大多數(shù)情況下都是要求對(duì)一組無(wú)序的數(shù)據(jù)按照數(shù)據(jù)值的大小以增序或者以降序排列數(shù)據(jù)。</p><p>  例如對(duì)一組學(xué)生的成績(jī)從高到低排序,以確

11、定學(xué)生的名次。又如要求對(duì)員工的工資排序,以方便管理。在現(xiàn)實(shí)生活中要用到排序的地方不勝枚舉,雖然很多高級(jí)程序設(shè)計(jì)語(yǔ)言都封裝了排序的算法,用來(lái)也方便,程序員也容易掌握和運(yùn)用,但是這些封裝好了的排序算法將會(huì)一成不變的按照設(shè)計(jì)者當(dāng)初設(shè)計(jì)時(shí)設(shè)計(jì)的步驟工作,無(wú)法在實(shí)際情況中進(jìn)行優(yōu)化,也就不以利于提高程序的總體效率,所以根據(jù)實(shí)際的情況編寫(xiě)實(shí)際的排序算法才是可行的。</p><p>  本次課程設(shè)計(jì)單獨(dú)實(shí)現(xiàn)直接插入排序、折半插入

12、排序、希爾排序、冒泡排序、快速排序、直接選擇排序、堆排序、歸并排序、基數(shù)排序。</p><p><b>  概要設(shè)計(jì)</b></p><p>  直接插入排序的設(shè)計(jì)思路</p><p>  直接插入排序是一種最簡(jiǎn)單的排序方法,他的基本操作是將一個(gè)數(shù)據(jù)元素直接插入到已排好序的一組數(shù)據(jù)中,從而得到一個(gè)新的元素?cái)?shù)加一的有序表。</p>

13、<p>  由于數(shù)據(jù)存儲(chǔ)結(jié)構(gòu)采用的是數(shù)組,所以插入一個(gè)元素就涉及到查找待插入元素的位置,移動(dòng)其他元素,而數(shù)組頭一個(gè)結(jié)點(diǎn)設(shè)為哨兵結(jié)點(diǎn)。</p><p>  如圖1所示:在序列1,3,5,8中插入4</p><p><b>  圖1</b></p><p>  這樣就有完成了一次插入,重復(fù)這種操作直到整個(gè)數(shù)組有序?yàn)橹埂?lt;/p>

14、<p>  折半插入排序的設(shè)計(jì)思路</p><p>  折半插入排序是在直接插入排序的基礎(chǔ)上減少了比較和移動(dòng)的次數(shù)從而提高算法的效率,因?yàn)榇迦霐?shù)據(jù)前面的所有數(shù)據(jù)已經(jīng)有序了。</p><p>  先用兩個(gè)指針low和high通過(guò)折半查找的方法確定待插入數(shù)據(jù)的位置,最后low所指向的位置即為待插入數(shù)據(jù)的位置,先將把待查入數(shù)據(jù)放到0號(hào)單元然后low以后的單元依次后移一位然后將0號(hào)

15、單元的數(shù)據(jù)插入到low指向的單元中,重復(fù)這個(gè)操作直到整個(gè)數(shù)組有序。</p><p><b>  希爾排序的設(shè)計(jì)思路</b></p><p>  希爾排序的設(shè)計(jì)思想是:先將整個(gè)待排序數(shù)列分割成若干子序列,對(duì)子序列分別進(jìn)行直接插入排序,待整個(gè)序列基本有序時(shí)再對(duì)整個(gè)數(shù)列進(jìn)行一次直接插入排序。</p><p><b>  冒泡排序設(shè)計(jì)思路&l

16、t;/b></p><p>  冒泡排序很簡(jiǎn)單,首先將第一個(gè)數(shù)據(jù)的關(guān)鍵字和第二個(gè)數(shù)據(jù)的關(guān)鍵字比較,若為逆序,則將兩個(gè)數(shù)據(jù)交換,然后比較第二個(gè)和第三個(gè)數(shù)據(jù)的關(guān)鍵字,以此類推,直到第n-1個(gè)數(shù)據(jù)和第n個(gè)數(shù)據(jù)進(jìn)行比較。然后重復(fù)上述操作,第i次循環(huán)只進(jìn)行到第n-i個(gè)為止,因?yàn)閚-i以后的數(shù)據(jù)已經(jīng)有序了。</p><p><b>  快速排序設(shè)計(jì)思路</b></p&

17、gt;<p>  快速排序是對(duì)冒泡排序的一種改進(jìn)。它的基本思想是:通過(guò)一趟排序?qū)⒋判蛴涗浄指畛瑟?dú)立的兩部分,其中一部分關(guān)鍵字均比另一部分關(guān)鍵字小,然后分別對(duì)這兩部分繼續(xù)排序直到整個(gè)有序。</p><p><b>  如圖2所示:</b></p><p>  第一次找到3的位置3和6交換,1和4交換;</p><p>  第二次找

18、到1的位置1和2交換,6的位置不變;</p><p>  第三次找到4的位置4和5交換,至此整個(gè)序列有序。</p><p><b>  圖2</b></p><p>  直接選擇排序的設(shè)計(jì)思路</p><p>  一趟直接選擇排序的操作為:通過(guò)n-i次關(guān)鍵字間的比較,從n-i+1個(gè)數(shù)據(jù)中選出關(guān)鍵字最小的數(shù)據(jù),并和第i個(gè)數(shù)

19、據(jù)交換,重復(fù)n-1次就得到了一個(gè)有序的序列。</p><p><b>  堆排序的設(shè)計(jì)思路</b></p><p>  堆排序只需要一個(gè)數(shù)組就可以了,每個(gè)數(shù)據(jù)占一個(gè)存儲(chǔ)空間。堆的定義如下:對(duì)n個(gè)元素的序列{K1,K2,……,Kn}當(dāng)且僅當(dāng)滿足下列關(guān)系時(shí)稱之為堆:</p><p>  Ki<=K2i&&Ki<=K2i+

20、1 或者 K2i<=Ki&&K2i+1<=Ki</p><p>  前者稱為最小堆,后者稱為最大堆。</p><p>  如圖3所示:對(duì)序列8 , 1 , 7 , 4, 5 ,3建堆</p><p>  如圖4.1-4.5所示排序過(guò)程:最終為1,3,4,5,7,8</p><p>  圖3圖4.1

21、</p><p>  圖4.2 圖4.3</p><p><b>  圖4.4圖4.5</b></p><p><b>  歸并排序的設(shè)計(jì)思路</b></p><p>  假設(shè)初始序列為n個(gè)數(shù)據(jù)元素,則可以看成是n個(gè)有序的子序列,每個(gè)子序列的長(zhǎng)度

22、為1,然后兩兩歸并,得到n/2個(gè)長(zhǎng)度為2或者為1的有序子序列,然后再兩兩歸并……直到得到一個(gè)長(zhǎng)度為n的有序序列為止。</p><p>  這種排序稱為2路歸并排序。2路歸并排序的核心操作就是將兩個(gè)有序序列歸并為一個(gè)有序序列。</p><p><b>  如圖5所示:</b></p><p><b>  圖5</b><

23、/p><p>  原始序列為4,1,5,3,2。</p><p>  第一趟排序后將4,1合并,5,3合并后為1,4,3,5,2</p><p>  第二趟合并后將1,4和3,5合并后為1,3,4,5,2</p><p>  第三趟合并后將1,3,4,5和2合并為1,2,3,4,5。</p><p><b>  

24、基數(shù)排序的設(shè)計(jì)思路</b></p><p>  基數(shù)排序是借助“分配”和“收集”兩種操作對(duì)單邏輯關(guān)鍵字進(jìn)行排序。</p><p>  例如關(guān)鍵字k是數(shù)字且在0到999之間,則可以把每個(gè)十進(jìn)制數(shù)字看成一個(gè)關(guān)鍵字,k由3個(gè)關(guān)鍵字(k1,k2,k3)組成,分別對(duì)應(yīng)k的百位,十位,個(gè)位數(shù)字。所以如果有一個(gè)這樣的數(shù)字序列,從低位關(guān)鍵字起按關(guān)鍵字的不同值將數(shù)據(jù)元素分配到0~9標(biāo)記的隊(duì)列中然

25、后在收集,如此重復(fù)3次即可。</p><p>  基數(shù)的“基”就是每個(gè)關(guān)鍵字的取值范圍,這里是10。</p><p>  假設(shè)每個(gè)關(guān)鍵字ki在[0,2]之間,則有三個(gè)隊(duì)列。</p><p>  有序列:002,202,011,210,001,101</p><p>  則排序過(guò)程如圖6.1~6.3所示:</p><p>

26、;<b>  圖6.1</b></p><p>  第一趟排序之后的序列為:(以個(gè)位數(shù)字為關(guān)鍵字)</p><p>  210,011,001,101,002,202</p><p><b>  圖6.2</b></p><p>  第二趟排序之后序列為:(以十位數(shù)字為關(guān)鍵字)</p>

27、<p>  001,101,002,202,210,011</p><p><b>  圖6.3</b></p><p>  第三趟排序之后序列為:(以百位數(shù)字為關(guān)鍵字)</p><p>  001,002,011,101,202,210</p><p><b>  詳細(xì)設(shè)計(jì)</b>&l

28、t;/p><p><b>  直接插入排序</b></p><p>  int * array代表待排序的數(shù)組,length代表待排序數(shù)組的長(zhǎng)度,array[0]設(shè)為監(jiān)視哨。</p><p>  void InsertSort(int * array , int length)</p><p><b>  {<

29、;/b></p><p>  for(int i = 2 ; i <= length ; i++)</p><p><b>  {</b></p><p>  if(array[i] < array[i-1])</p><p><b>  {</b></p><

30、p>  array[0] = array[i];</p><p>  array[i] = array[i-1];</p><p><b>  int j;</b></p><p>  //查找合適的位置并移動(dòng)數(shù)據(jù)</p><p>  for(j = i-2 ; array[0] < array[j] ; j

31、--)</p><p>  array[j+1] = array[j];</p><p>  //在合適的位置插入數(shù)據(jù)</p><p>  array[j+1] = array[0];</p><p><b>  }</b></p><p><b>  }</b></p

32、><p><b>  }</b></p><p><b>  折半插入排序</b></p><p>  int * array代表待排序的數(shù)組,length代表待排序數(shù)組的長(zhǎng)度</p><p>  void BInsertSort(int * array , int length)</p>

33、<p><b>  {</b></p><p>  for(int i = 2 ; i <= length ; i++)</p><p><b>  {</b></p><p>  array[0] = array[i];</p><p>  int low = 1 , high

34、= i-1;</p><p>  //折半查找插入的合適的位置</p><p>  while(low <= high)</p><p><b>  {</b></p><p>  int mid = (low+high)/2;</p><p>  if(array[0] < arra

35、y[mid])</p><p>  high = mid-1;</p><p><b>  else</b></p><p>  low = mid+1;</p><p><b>  }</b></p><p>  //將low到i-1的數(shù)據(jù)向后移動(dòng)一位</p>

36、<p>  for(int j = i-1 ; j >= low ; j--)</p><p>  array[j+1] = array[j];</p><p>  //low的位置即array[0]的正確位置</p><p>  array[low] = array[0];</p><p><b>  }<

37、/b></p><p><b>  }</b></p><p><b>  希爾排序</b></p><p>  int * array代表待排序的數(shù)組,length代表待排序數(shù)組的長(zhǎng)度,increment代表增量</p><p>  void ShellInsert(int * array

38、, int length , int increment)</p><p><b>  {</b></p><p>  //間隔為增量的子序列使用直接插入排序</p><p>  for(int i = increment+1 ; i <= length ; i++)</p><p><b>  {&l

39、t;/b></p><p>  if(array[i] < array[i-increment])</p><p><b>  {</b></p><p>  array[0] = array[i];</p><p><b>  int j;</b></p><p&g

40、t;  for(j = i-increment ; j > 0 && array[0] < array[j] ;</p><p>  j -= increment)</p><p>  array[j+increment] = array[j];</p><p>  array[j+increment] = array[0];</p

41、><p><b>  }</b></p><p><b>  }</b></p><p><b>  }</b></p><p><b>  //希爾排序主函數(shù)</b></p><p>  void ShellSort(int *arr

42、ay , int length)</p><p><b>  {</b></p><p><b>  //增量</b></p><p>  int increment = length/2;</p><p>  while(increment>=1)</p><p>&

43、lt;b>  {</b></p><p>  ShellInsert(array , length , increment);</p><p>  //逐步減小增量直至為1</p><p>  increment /= 2;</p><p><b>  }</b></p><p>

44、;<b>  }</b></p><p><b>  冒泡排序</b></p><p>  int * array代表待排序的數(shù)組,length代表待排序數(shù)組的長(zhǎng)度</p><p>  void BubbleSort(int * array , int length)</p><p><b&g

45、t;  {</b></p><p>  for(int i = length , change = true; i > 1 && change ; i--)</p><p><b>  {</b></p><p>  change = false;</p><p>  for(int j

46、 = 1 ; j < i ; j++)</p><p><b>  {</b></p><p>  if(array[j]>array[j+1])</p><p><b>  {</b></p><p>  change = true;</p><p>  swa

47、p(array[j] , array[j+1]);</p><p><b>  }</b></p><p><b>  }</b></p><p><b>  }</b></p><p><b>  }</b></p><p>&l

48、t;b>  快速排序</b></p><p>  int * array代表待排序的數(shù)組,length代表待排序數(shù)組的長(zhǎng)度,將p到r之間比array[r]小的數(shù)據(jù)已到array[r]前,比array[r]大的移到后面,并返回array[r]的正確位置。</p><p>  int Partition(int * array , int p , int r)</p&g

49、t;<p><b>  {</b></p><p>  int x = array[r];</p><p>  //下標(biāo)小于等于i的數(shù)據(jù)都比x小,否則比x大</p><p>  int i = p-1;</p><p>  for(int j = p ; j < r ; j++)</p>

50、<p><b>  {</b></p><p>  if(array[j] <= x)</p><p><b>  {</b></p><p><b>  i++;</b></p><p>  swap(array[i] , array[j]);</p&

51、gt;<p><b>  }</b></p><p><b>  }</b></p><p>  swap(array[i+1] , array[r]);</p><p>  //返回第一個(gè)比x大的位置,即arrray[r]的合適位置</p><p>  return i+1;<

52、/p><p><b>  }</b></p><p><b>  //快速排序主函數(shù)</b></p><p>  void QuickSort(int * array , int p , int r)</p><p><b>  {</b></p><p>

53、<b>  if(p < r)</b></p><p><b>  {</b></p><p>  int q = Partition(array , p , r);</p><p>  QuickSort(array , p , q-1);</p><p>  QuickSort(array

54、 , q+1 , r);</p><p><b>  }</b></p><p><b>  }</b></p><p><b>  直接選擇排序</b></p><p>  int * array代表待排序的數(shù)組,length代表待排序數(shù)組的長(zhǎng)度,找到從bgn到length之

55、間最小的數(shù)據(jù)的位置</p><p>  int SelectMinKey(int * array , int length , int bgn)</p><p><b>  {</b></p><p>  int min = array[bgn] , j = bgn;</p><p>  for(int i = bgn+

56、1 ; i <= length ; i++)</p><p><b>  {</b></p><p>  if(min > array[i])</p><p><b>  {</b></p><p>  min = array[i];</p><p><b&

57、gt;  j = i;</b></p><p><b>  }</b></p><p><b>  }</b></p><p><b>  return j;</b></p><p><b>  }</b></p><p&g

58、t;<b>  //選擇排序主函數(shù)</b></p><p>  void SelectSort(int * array , int length)</p><p><b>  {</b></p><p>  for(int i = 1 ; i < length ; i++)</p><p>&

59、lt;b>  {</b></p><p>  int j = SelectMinKey(array , length , i);</p><p>  //將最小的數(shù)據(jù)交換到位置i</p><p>  if(i != j) swap(array[i] , array[j]);</p><p><b>  }</

60、b></p><p><b>  }</b></p><p><b>  堆排序</b></p><p>  int * array代表待排序的數(shù)組,heapLength代表堆的長(zhǎng)度,i代表第i個(gè)結(jié)點(diǎn),保持最大堆的性質(zhì)</p><p>  void MaxHeapify(int * array

61、 , int heapLength , int i)</p><p><b>  {</b></p><p>  int l = i*2;</p><p>  int r = i*2+1;</p><p>  //父結(jié)點(diǎn)和左右兒子中最大值的位置</p><p>  int largest;<

62、/p><p>  if(l <= heapLength && array[l] > array[i])</p><p>  largest = l;</p><p><b>  else</b></p><p>  largest = i;</p><p>  if(r &

63、lt;= heapLength && array[largest] < array[r])</p><p>  largest = r;</p><p>  //將最大值放到父結(jié)點(diǎn),并繼續(xù)往下調(diào)整</p><p>  if(largest != i)</p><p><b>  {</b></

64、p><p>  swap(array[i] , array[largest]);</p><p>  MaxHeapify(array , heapLength , largest);</p><p><b>  }</b></p><p><b>  }</b></p><p>

65、;<b>  //建堆</b></p><p>  void BuildMaxHeap(int * array , int heapLength)</p><p><b>  {</b></p><p>  for(int i = heapLength/2 ; i >= 1 ; i--)</p><

66、;p>  MaxHeapify(array , heapLength , i);</p><p><b>  }</b></p><p><b>  //堆排序主函數(shù)</b></p><p>  void HeapSort(int * array , int length)</p><p>&

67、lt;b>  {</b></p><p>  BuildMaxHeap(array , length);</p><p>  int heapLength = length;</p><p>  for(int i = length ; i >= 2 ; i--)</p><p><b>  {</b&

68、gt;</p><p>  //將堆頂?shù)臄?shù)據(jù)和堆最后個(gè)數(shù)據(jù)交換,堆頂?shù)臄?shù)據(jù)最大</p><p>  swap(array[1] , array[heapLength]);</p><p><b>  //堆的大小減一</b></p><p>  heapLength--;</p><p>  //

69、調(diào)整堆使之始終滿足最大堆的性質(zhì)</p><p>  MaxHeapify(array , heapLength ,1);</p><p><b>  }</b></p><p><b>  }</b></p><p><b>  歸并排序</b></p><

70、p>  將有序的ary1[i...m]和ary1[m+1,n]合并為有序的ary2[i...n]</p><p>  void Merge(int * ary1 , int * ary2 , int i , int m , int n)</p><p><b>  {</b></p><p>  int j , k;</p>

71、<p>  for(j = m+1 , k = i ; i <= m && j <= n ; k++)</p><p><b>  {</b></p><p>  if(ary1[i] < ary1[j])</p><p>  ary2[k] = ary1[i++];</p><

72、p><b>  else</b></p><p>  ary2[k] = ary1[j++];</p><p><b>  }</b></p><p>  if(i <= m)</p><p><b>  {</b></p><p>  fo

73、r(; i <= m ; i++)</p><p>  ary2[k++] = ary1[i];</p><p><b>  }</b></p><p>  if(j <= n)</p><p><b>  {</b></p><p>  for(; j <

74、= n ; j++)</p><p>  ary2[k++] = ary1[j];</p><p><b>  }</b></p><p><b>  }</b></p><p>  //將arySource[s...t]歸并為有序的aryResult[s...t]</p><p

75、>  void MergeSort(int * arySource , int * aryResult , int s , int t)</p><p><b>  {</b></p><p>  if(s == t)</p><p><b>  {</b></p><p>  aryResu

76、lt[s] = arySource[s];</p><p><b>  }</b></p><p><b>  else</b></p><p><b>  {</b></p><p>  int m = (s+t)/2 , aryTmp[9];</p><

77、;p>  //將arySource[s...m]歸并為有序的aryTmp[s...m]</p><p>  MergeSort(arySource , aryTmp , s , m);</p><p>  //將arySource[m+1...t]歸并為有序的aryTmp[m+1...t]</p><p>  MergeSort(arySource , ary

78、Tmp , m+1 , t);</p><p>  //將aryTmp[s...m],aryTmp[m+1...t]歸并為有序的aryResult[s...t]</p><p>  Merge(aryTmp , aryResult , s , m , t);</p><p><b>  }</b></p><p><

79、;b>  }</b></p><p><b>  基數(shù)排序</b></p><p>  元素的存儲(chǔ)結(jié)構(gòu),為方便計(jì)算將關(guān)鍵值設(shè)為string類型</p><p>  struct Data</p><p><b>  {</b></p><p>  strin

80、g key;//數(shù)據(jù)的關(guān)鍵字</p><p>  int next;//下一個(gè)數(shù)據(jù)的位置</p><p>  } array[12];</p><p>  //每個(gè)隊(duì)列的頭指針和為指針</p><p>  int front[10] , trail[10];</p><p><b>  //創(chuàng)建靜態(tài)鏈表<

81、;/b></p><p>  void CreateLinkList(string key , int index , int pre)</p><p><b>  {</b></p><p>  array[pre].next = index;</p><p>  array[index].key = key;&

82、lt;/p><p>  array[index].next = 0;</p><p><b>  }</b></p><p>  //獲得數(shù)據(jù)的第i位數(shù)(將字符變?yōu)檎麛?shù))</p><p>  int order(int i , string key)</p><p><b>  {</

83、b></p><p>  return key[i]-'0';</p><p><b>  }</b></p><p>  分配函數(shù),按數(shù)據(jù)的第i位關(guān)鍵字將數(shù)據(jù)放入相應(yīng)的隊(duì)列中</p><p>  void Distribute(int i)</p><p><b>

84、;  {</b></p><p>  memset(front , 0 , sizeof(front));</p><p>  for(int p = array[0].next ; p ; p = array[p].next)</p><p><b>  {</b></p><p>  int j = or

85、der(i , array[p].key);</p><p>  if(!front[j])</p><p><b>  {</b></p><p>  front[j] = trail[j] = p;</p><p><b>  }</b></p><p><b>

86、;  else</b></p><p><b>  {</b></p><p>  array[trail[j]].next = p;</p><p>  trail[j] = p;</p><p><b>  }</b></p><p><b>  }

87、</b></p><p><b>  }</b></p><p>  收集函數(shù),合并各個(gè)隊(duì)列中的數(shù)據(jù),順序從0號(hào)隊(duì)列到9號(hào)隊(duì)列</p><p>  void Collect()</p><p><b>  {</b></p><p>  int i = 0;<

88、;/p><p>  //找到第一個(gè)非空的隊(duì)列</p><p>  while(i < 10 && !front[i]) i++;</p><p>  array[0].next = front[i];</p><p>  int tmp = trail[i];</p><p>  for(i++; i

89、 < 10 ; i++)</p><p><b>  {</b></p><p><b>  //合并非空隊(duì)列</b></p><p>  if(front[i])</p><p><b>  {</b></p><p>  array[tmp].

90、next = front[i];</p><p>  tmp = trail[i];</p><p><b>  }</b></p><p><b>  }</b></p><p>  array[tmp].next = 0;</p><p><b>  }<

91、/b></p><p><b>  //基數(shù)排序主函數(shù)</b></p><p>  void RadixSort(int keyNum)</p><p><b>  {</b></p><p>  //從個(gè)位一直到最高位進(jìn)行分配和收集</p><p>  for(int

92、 i = keyNum-1 ; i >= 0 ; i--)</p><p><b>  {</b></p><p>  Distribute(i);</p><p>  Collect();</p><p><b>  }</b></p><p><b>  

93、}</b></p><p><b>  調(diào)試分析</b></p><p><b>  直接插入排序</b></p><p>  輸入數(shù)據(jù):49,38,65,97,76,13,27,49</p><p>  正確結(jié)果:13,27,38,49,49,65,76,97</p>&

94、lt;p>  本算法時(shí)間復(fù)雜度為:O(n^2)</p><p><b>  運(yùn)行結(jié)果:</b></p><p><b>  折半插入排序</b></p><p>  輸入數(shù)據(jù):49,38,65,97,76,13,27,49</p><p>  正確結(jié)果:13,27,38,49,49,65,76

95、,97</p><p>  本算法時(shí)間復(fù)雜度:O(n^2)</p><p><b>  運(yùn)行結(jié)果:</b></p><p><b>  希爾排序</b></p><p>  輸入數(shù)據(jù):49,38,65,97,76,13,27,49,55,04</p><p>  正確結(jié)果:4

96、,13,27,38,49,49,55,65,76,97</p><p>  時(shí)間復(fù)雜度:O(n^(3/2))</p><p><b>  運(yùn)行結(jié)果:</b></p><p><b>  冒泡排序</b></p><p>  輸入數(shù)據(jù):49,38,65,97,76,13,27,49</p>

97、<p>  正確結(jié)果:13,27,38,49,49,65,76,97</p><p>  時(shí)間復(fù)雜度:O(n^2)</p><p><b>  運(yùn)行結(jié)果:</b></p><p><b>  快速排序</b></p><p>  輸入數(shù)據(jù):49,38,65,97,76,13,27,49

98、</p><p>  正確結(jié)果:13,27,38,49,49,65,76,97</p><p>  時(shí)間復(fù)雜度:O(nlogn)</p><p><b>  運(yùn)行結(jié)果:</b></p><p><b>  直接選擇排序</b></p><p>  輸入數(shù)據(jù):49,38,65,

99、97,76,13,27,49</p><p>  正確結(jié)果:13,27,38,49,49,65,76,97</p><p>  時(shí)間復(fù)雜度:O(n^2)</p><p><b>  運(yùn)行結(jié)果:</b></p><p><b>  堆排序</b></p><p>  輸入數(shù)據(jù):

100、4,1,3,2,16,9,10,14,8,7</p><p>  正確結(jié)果:1,2,3,4,7,8,9,10,14,16</p><p>  時(shí)間復(fù)雜度:O(nlogn)</p><p><b>  運(yùn)行結(jié)果:</b></p><p><b>  歸并排序</b></p><p&

101、gt;  輸入數(shù)據(jù):49 38 65 97 76 13 27</p><p>  正確結(jié)果:13 27 38 49 65 76 97</p><p>  時(shí)間復(fù)雜度:O(nlogn)</p><p><b>  運(yùn)行結(jié)果:</b></p><p>  調(diào)試問(wèn)題思考和算法改進(jìn):</p><p>  

102、由于在歸并排序主函數(shù)中用了3個(gè)數(shù)組arySource,aryResult,aryTmp,開(kāi)始的時(shí)候aryTmp定義成全局變量結(jié)果程序老是運(yùn)行錯(cuò)誤,最后在每次遞歸調(diào)的用排序主函數(shù)本身時(shí)重新定義aryTmp,這樣問(wèn)題就解決了,因?yàn)槿謅ryTmp在遞歸調(diào)用的時(shí)候會(huì)把前面的結(jié)果覆蓋掉。但是如果在數(shù)據(jù)量小的時(shí)候這樣做還是可行的,如果一旦數(shù)據(jù)量非常大了遞歸調(diào)用會(huì)非常的耗時(shí),而且每次遞歸調(diào)用都要臨時(shí)開(kāi)一個(gè)數(shù)組aryTmp這樣非常浪費(fèi)空間,一個(gè)好的改

103、進(jìn)思路就是把這個(gè)遞歸的算法該為非遞歸的。</p><p><b>  基數(shù)排序</b></p><p>  輸入數(shù)據(jù):278,109,063,930,589,184,505,269,008,083</p><p>  正確結(jié)果:008,063,083,109,184,269,278,505,589,930</p><p>

104、;<b>  時(shí)間復(fù)雜度:</b></p><p>  對(duì)于n個(gè)數(shù)據(jù)元素(假設(shè)每個(gè)數(shù)據(jù)元素含d個(gè)關(guān)鍵字,每個(gè)關(guān)鍵字的取值范圍為rd個(gè)值)進(jìn)行基數(shù)排序的時(shí)間復(fù)雜度為</p><p>  O(d(n+rd)),其中每一趟分配的時(shí)間復(fù)雜度為O(n),每一趟收集的時(shí)間復(fù)雜度為O(rd),整個(gè)排序需進(jìn)行d趟分配和收集。</p><p><b>

105、  運(yùn)行結(jié)果:</b></p><p>  數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)總結(jié)</p><p><b>  課程設(shè)計(jì)的收獲</b></p><p>  通過(guò)本次課程設(shè)計(jì),我再次復(fù)習(xí)并掌握了各種排序算法,深刻的理解了數(shù)據(jù)結(jié)構(gòu)在程序設(shè)計(jì)中的重要地位。學(xué)會(huì)了通過(guò)各種方法解決學(xué)習(xí)中遇到的問(wèn)題,懂得了與人合作的真諦,合作才能提高效率才能共贏。</p&

106、gt;<p>  通過(guò)這次課程設(shè)計(jì)我初步理解了C/C++語(yǔ)言中排序庫(kù)函數(shù)的實(shí)現(xiàn)方法,它并不是傳說(shuō)中的那么神秘,它也是封裝了最基本的排序算法,然后提供一個(gè)接口給程序員調(diào)用。</p><p>  通過(guò)本次課程設(shè)計(jì)還讓我認(rèn)識(shí)到了,要想編寫(xiě)一個(gè)高效率的算法學(xué)好數(shù)據(jù)結(jié)構(gòu)真的很重要。</p><p>  遇到的問(wèn)題及解決思路</p><p>  在編寫(xiě)程序的時(shí)候總

107、是犯一些低級(jí)的錯(cuò)誤,比如將“==”寫(xiě)成了“=”,然后程序老是出錯(cuò),可是自己認(rèn)真的想一下思路覺(jué)得沒(méi)有問(wèn)題,當(dāng)別人檢查的時(shí)候一眼就瞧出來(lái)了。像這種情況就只有把常量放在左邊,這樣在編譯的時(shí)候都通不過(guò),可直接通過(guò)編譯器查出。</p><p>  比如我在寫(xiě)歸并排序的時(shí)候,程序偽代碼上直接寫(xiě)的三個(gè)數(shù)組,但是沒(méi)有說(shuō)數(shù)組是定義的全局變量還是局部變量,而我初步看了偽代碼之后就按照自己的思路寫(xiě),可是老是得不到結(jié)果,最后調(diào)試了半天才

108、發(fā)現(xiàn)在Merge函數(shù)里面ary1的值和ary2的值相等,此時(shí)我才恍然大悟,由于是遞歸調(diào)用,這樣的話最后傳的參數(shù)ary1和ary2的值就是aryTmp。此時(shí)只要把a(bǔ)ryTmp定義成局部變量就可以了。</p><p>  對(duì)數(shù)據(jù)結(jié)構(gòu)課程的思考</p><p>  數(shù)據(jù)結(jié)構(gòu)課程對(duì)計(jì)算機(jī)專業(yè)來(lái)說(shuō)是核心課程了,如果沒(méi)有學(xué)數(shù)據(jù)結(jié)構(gòu)那么在面對(duì)問(wèn)題時(shí),就很難想到好的解決思路。但是數(shù)據(jù)結(jié)構(gòu)書(shū)上講的算法有時(shí)很

109、晦澀,難懂,有時(shí)一個(gè)重要的步驟一句偽代碼就解決了但是實(shí)際編程時(shí)卻不好解決。有時(shí)只講一個(gè)算法的實(shí)現(xiàn)卻不講它的應(yīng)用,讓人感覺(jué)學(xué)了沒(méi)啥用處。</p><p>  不過(guò)總的來(lái)講學(xué)了數(shù)據(jù)結(jié)構(gòu)后,我的編程能力和閱讀他人代碼的能力有了很大的提高。我想數(shù)據(jù)結(jié)構(gòu)這門(mén)課程雖然結(jié)束了,但真正學(xué)習(xí)它才剛剛開(kāi)始……</p><p><b>  參考文獻(xiàn)</b></p><p

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 眾賞文庫(kù)僅提供信息存儲(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)論