歸併排序的遞迴,非遞迴實現

2021-10-06 06:31:35 字數 1480 閱讀 8348

和選擇排序一樣,歸併排序的效能不受輸入資料的影響,但表現比選擇排序好的多,因為始終都是o(n log n)的時間複雜度。代價是需要額外的記憶體空間,o(n)的額外空間。該演算法是採用分治法 。

歸併排序是一種穩定的排序方法。將已有序的子串行合併,得到完全有序的序列;

public

int[

] mergesort (

int array)

public

int[

]merge

(int a,

int b)

while

(i < a.length )

c[value++

]= a[i++];

while

(j < b.length )

c[value++

]= b[j++];

return c;

}

上面程式中,遞迴之後,方法返回的是排序好的序列,但是原來序列array沒有改變。需要注意。因為是在方法中返回了的merge函式,對形參進行了賦值,方法裡面的形參指向了新的位址,而外面的實際引數還是原來的位址。

非遞迴的話,首先將序列都分為只有乙個數值的子串行,看做有序

之後,有序的子序從1,2,4,8翻倍,一直歸併,直到子序的長度大於等於陣列大小

public

void

mergepass

(int

a,int[

] tmpa,

int s)

if(i+s < a.length )

// 未合併的元素大於s個,說明可以有倆個子列,乙個長度s,乙個不足s,歸併

merge1

(a, tmpa, i, i+s,a.length-1)

;else

// 未合併的元素小於等於s個,只有乙個子列,直接放在臨時陣列後面

for(

int j = i; j

) tmpa[j]

= a[j];}

public

void

merge1

(int

a,int[

] b,

int left,

int right,

int rightend)

while

(left <= leftend)

b[tmp++

]= a[left++];

while

(right <= rightend)

b[tmp++

]= a[right++];

}public

void

mergesort

(int

a)}

歸併排序 遞迴 非遞迴

首先簡單的介紹一下歸併演算法的核心思想 將我們將一組資料分成若干個組,即分到每組資料為1個元素的情況下就不用分了,然後在分別比較每兩組資料元素的大小,將其合併為一組資料再去和其他同等級別的組的資料元素取比較,然後合併到臨時的空間中然後在複製給原空間,依此類推,直到最後全部合併完畢,陣列就成為一組有序...

歸併排序 非遞迴實現

我們知道,遞迴實現的缺點就是會一直呼叫棧,而棧記憶體往往是很小的。所以,我們嘗試著用迴圈的辦法去實現歸併排序。之氣提到過,歸併排序的基本思路是將待排序序列r 0 n 1 看成是n個長度為1的有序序列,將相鄰的有序表成對歸併,得到n 2個長度為2的有序表 將這些有序序列再次歸併,得到n 4個長度為4的...

歸併排序 非遞迴實現

1 歸併,非遞迴實現 1 段長度倍增,1,2,3,4,8,n 當要合併的單段長 2 以兩段的長度作為每次偏移的長度 每次合併是兩個單段一組進行合併,因此要不斷地偏移兩個單段的長度。5 3 5 2 8 7 2 3 5 7 8 include include include using namespac...