前面我寫的歸併排序實現,雖然原理上沒什麼問題,但演算法實現不是很理想,今天沒什麼事情,重新優化了一下,這裡比較一下:
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)
歸併排序 歸併排序是一種遞迴排序演算法,無論陣列元素的原始順序如何,其效能恆定不變。將陣列一分為二,分別排序兩部分元素,再將有序的兩半陣列歸併為乙個有序陣列。歸併步驟比較陣列前一半的元素與陣列的後一半元素,並將較小元素移到臨時陣列,該過程繼續前進,直到其中一半再沒有元素為止。此後只需將其餘元素移到臨...