其排序演算法的基本思想就是,將原序列**(假設有n個關鍵字)**分成很多個子序列每個子串行就有乙個關鍵字且子串行之間是個不相同的。之後就是將兩兩的子串行進行合併,所以整個資料規模就變成了n/2,之後在進行重複操作,資料規模不斷的除以2,直至變為1。
以下是**:
void merge(int a,int low,,int mid ,int high )
while(i<=mid&&j<=high)
else
}while(i<=mid)
while(j<=high)
for(int i=low;int j=0;i<=high)
delete temp;//注意釋放空間。
} void mergesort(int r,int low, int high){
if(low
`分析其時間複雜度:
第一趟:需要執行2*(n/2)=n次基本操作,其中2是每個子串行中關鍵字的個數,n/2是要對多少子串行進行歸併操作。
第二趟:4*(n/4)=n次操作。
第三趟:8*(n/8)=n次操作。
.........
第k趟:2的k次方*(n/2的k次方)=n;
其中2的k次方=1,只進行一次歸併操作,即僅有兩個子串行。k=log2n;
並且其時間複雜度與初始序列無關,所以不論是最好還是最壞的情況其時間複雜度都是o(nlog2n)。
其空間複雜度是因為需要轉存整個序列所以是o(n)。
(C )資料結構排序 二路歸併排序
二路歸併排基本思想 把擁有n個資料的陣列看做n個有序序列,然後兩兩歸併,得到n 2組有序序列 重複上述操作,達到n 4組有序序列 重複上述操作,直到n個資料均為有序。平均情況的時間複雜度 最好情況的時間複雜度 最壞情況的時間複雜度 空間複雜度 o nlog2 n o nlog2 n o nlog2 ...
排序演算法之二路歸併排序
二路歸併排序是歸併排序中最簡單的一種,其演算法思想是假設有兩個有序的序列,然後將這裡兩個序列合併 為乙個序列,只要找這兩個序列中較小的元素即可,最後把剩下的元素複製出來。void mergearray int a,int first,int mid,int last,int temp int i f...
排序演算法之二路歸併排序
二路歸併排序是採用的分而治之的思想。將乙個待排序的序列分成兩個序列,分別對這兩個序列排序。而對於這兩個序列排序的方式也是還之前一樣,將這兩個序列分別分成兩個序列分別排序。一直這樣分割下去,知道序列中沒有元素或者已有乙個元素為止。因為沒有元素的序列和只有乙個元素的序列定是乙個有序的序列,所以相當於將這...