1、歸併排序的實現
歸併排序也利用了分治法的思想,首先將序列分成左右兩部分,將左右兩部分分別排序,然後將有序的兩個子串行進行合併(即merge操作),程式是遞迴進行的,主函式實現如下:
//歸併排序主函式
void merge_sort(int* a,int first,int last)else
} while(i<=mid)
while(j<=last)
for(i=first,k=0;i<=last;i++,k++)
}
3、優化的merge操作
在合併長度為k和m的子串時,只需要min的額外空間即可,首先申請大小為min的空間,然後從子串行a和b中選擇最右邊的元素(即從子串行最大元素開始選),選擇兩個子串行中的較大者放在額外空間的右邊,從右向左填充,額外空間填滿之後再填充長度為max的子串行,從最後乙個開始填充,這種方法省了至少一半的空間,雖然空間複雜度仍未o(n),實現如下:
//申請額外n/2個空間,如果兩個子串大小不一樣,則申請的空間
//大小只需要為小的那個。選取兩個子串中的較大的從右往左排序。
//先填充額外空間c,再填充已有的空間。
void improved_merge(int* a,int first,int mid,int last)else
} k = mid;
while(i>=first&&j>=mid+1)else
} while(i>=first)
while(j>=mid+1)
for(i=mid+1,k=0;i<=last;i++,k++)
}
4、歸併排序的時間複雜度分析
進行一次merge操作,worst case需要進行k+m-1次比較,即若k+m=n,需要進行n-1次比較。
遞迴表示式可以近似表示為:
t(n)=t(n/2)+t(n/2)+cn。
由master theorem可得為nlgn,空間複雜度由上面分析可得為o(n)。
歸併排序的優化 自然歸併排序
不知道怎麼將這個演算法思想表達的更好,也不知道自己的理解的是否對 黑體的注釋是普通的自然歸併,從相鄰長度為1的子陣列段進行合併也就是一開始將每兩個相鄰元素進行歸併,然後再相鄰四個元素左右兩組都有序的合併成4個有序的.自下向上不斷往上歸併直到有序 自然合併排序是合併排序演算法的一種改進.自然合併排序 ...
歸併排序的優化
上節中的陣列合併 中,沒有做任何判斷就進行了陣列的合併,實際上當陣列1的最後乙個元素小於陣列2的第乙個元素時,根本不需要挨個對比 複製元素進行合併操作,此時陣列1和陣列2本來就是有序的,不需要合併,因此 改為 部分 mergesort1 list1,listsize1 mergesort1 list...
歸併排序(2 路歸併排序)
遞迴寫法 include define maxn 100 void merge int a,int l1,int r1,int l2,int r2 將陣列a的區間 l1,r1 和區間 l2,r2 合併為乙個有序區間 else while i r1 while j r2 for int i 0 i非遞...