歸併排序
基本思想:
先把陣列拆分,直到分成都只含有乙個元素的陣列,這樣兩兩合併,逐漸就可以得到已排序的字陣列,繼續合併直到合併成原來陣列長度為止。
時間複雜度:o(nlogn)
空間複雜度:o(nlogn),每一輪合併都需要n空間,共需要logn輪(第一輪是1×n(需要n個陣列,每個陣列長度為1),第二輪是2×2/n,第三輪4×4/n,。。。最後一輪是n/2×2(需要兩個陣列,每個長度為n/2))
穩定性:穩定
適用情況:非原地排序,需要額外空間。對資料有序性不敏感,無論情況好壞時間複雜度都是o(nlogn),穩定。
實現**(c語言)
#include#include//start表示陣列起始位置,mid表示中間位置,end表示結束位置
//對於陣列start--mid位置已有序,mid+1--end位置也已有序,merge功能是把這兩部分合併
void merge(int a,int start,int mid,int end)
for(;ia[k++]=left[i];
for(;ja[k++]=right[j];
}void mergesort(int a,int start,int end)
}int main()
; int i;
for(i=0;i<7;i++)
printf("%d",a[i]);
printf("\n");
mergesort(a,0,6);
for(i=0;i<7;i++)
printf("%d",a[i]);
printf("\n");
return 0;
}
常用排序演算法 歸併排序
確定分界點 mid l r 2 取中間數,分成 l,mid 和 mid,r 兩個區域。將l l,mid 和 mid,r 兩個區域進行遞迴排序。歸併 將左右兩個有序的序列合併成乙個有序序列。給定你乙個長度為n的整數數列。請你使用歸併排序對這個數列按照從小到大進行排序。並將排好序的數列按順序輸出。輸入格...
常用演算法排序(04) 歸併排序
歸併排序是利用先遞迴進行分解,將乙個規模為 n nn 的問題分解成兩個規模為 n 2 n 2n 2 的問題,再不斷的繼續進行遞迴分解成最終規模為1 11的問題。然後再逐漸的從小規模結果進行合併,最終得到完整的結果。也即分而治之的思想。其 如下 原圖位址 歸併排序使用了空間換時間的方式,用乙個輔助陣列...
排序演算法 歸併排序
歸併排序是建立在歸併操作上的一種有效的排序演算法。該演算法是採用分治法 divide and conquer 的乙個非常典型的應用。首先考慮下如何將將二個有序數列合併。這個非常簡單,只要從比較二個數列的第乙個數,誰小就先取誰,取了後就在對應數列中刪除這個數。然後再進行比較,如果有數列為空,那直接將另...