歸併排序 MergeSort 兩種實現方式比較

2021-08-26 04:41:46 字數 1370 閱讀 4305

前面我寫的歸併排序實現,雖然原理上沒什麼問題,但演算法實現不是很理想,今天沒什麼事情,重新優化了一下,這裡比較一下:

1) 第1種方式,我採用了輔助儲存來進行歸併,**如下:

private void mergesort1(int a, int is, int ie)

int ie1 = (is + ie) / 2;

int is2 = ie1 + 1;

mergesort1(a, is, ie1);

mergesort1(a, is2, ie);

//針對兩個排好序的段(is-ie1,is2-ie)進行整理

int i1 = is, j1 = is2;

//這裡的歸併採用輔助儲存空間的方式.

int result = new int[ie - is + 1];

int b = 0;

while(true)

else

}else if (j1 <= ie & i1 > ie1)

else if (j1 > ie & i1 <= ie1)

else

b++;

}//將結果回寫到原陣列,這是必須的,否則結果不對.

for (int j = is; j <= ie; j++)

}2)第2種方式,歸併時沒有採取輔助儲存,**如下:

private void mergesort2(int a, int is, int ie)

int ie1 = (is + ie) / 2;

int is2 = ie1 + 1;

mergesort2(a, is, ie1);

mergesort2(a, is2, ie);

//針對兩個排好序的段(is-ie1,is2-ie)進行整理歸併

int i1 = is, j1 = is2;

//因為都存放在陣列的is->ie段中,而且從小到大,從左到右存放。

//最大整理次數為ie-is,但一般只要整理完其中一段後即可.

while (true)

}else

a[i1 + 1] = tmp;

i1++; j1++;

}//因為兩個段都是排序的,右邊段如果整理完畢,則左邊段不再需要整理

if (j1 > ie)}}

兩種方式,在速度上相差非常大,我測試後發現,count計數的差距可達10倍,說明歸併時採用上述的插入排序,雖然節省了空間,但時間上損失非常大(因為歸併插入排序是的時間複雜度是的2次方級)。第1中方式採用了輔助儲存,t(n)=2n,時間複雜度是線性的。實際上,如果歸併演算法的歸併排序如果不借助輔助儲存空間,而是移位的話,效能不比純粹的插入排序好多少。歸併排序在時間上和空間上比起快速排序來說,還是差很多。因此歸併排序的實現還是要借助輔助儲存空間,才會真正發揮其優勢。

歸併排序 MergeSort 兩種實現方式比較

前面我寫的歸併排序實現,雖然原理上沒什麼問題,但演算法實現不是很理想,今天沒什麼事情,重新優化了一下,這裡比較一下 1 第1種方式,我採用了輔助儲存來進行歸併,如下 private void mergesort1 int a,int is,int ie int ie1 is ie 2 int is2...

歸併排序 Merge sort

merge the a s.m and a m 1.t to r s.t template void two merge typet a,typet r,int s,int m,int t while i m r k a i while j t r k a j merge the a 0.n 1 s...

歸併排序(merge sort)

歸併排序 歸併排序是一種遞迴排序演算法,無論陣列元素的原始順序如何,其效能恆定不變。將陣列一分為二,分別排序兩部分元素,再將有序的兩半陣列歸併為乙個有序陣列。歸併步驟比較陣列前一半的元素與陣列的後一半元素,並將較小元素移到臨時陣列,該過程繼續前進,直到其中一半再沒有元素為止。此後只需將其餘元素移到臨...