和選擇排序一樣,歸併排序的效能不受輸入資料的影響,但表現比選擇排序好的多,因為始終都是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...