2020-8-16
private
void
merge
(comparable[
] a,
int lo,
int mid,
int hi)
int left=lo;
//左部分開始
int right=mid+1;
//右部分開始元素下標
for(
int i=lo;i<=hi;i++
)}
package algorithm;
public
class
merge
comparable[
] tep;
public
void
sort
(comparable[
] a)
private
void
sort
(comparable[
] a,
int lo,
int hi)
private
void
merge
(comparable[
] a,
int lo,
int mid,
int hi)
int left=lo;
//左部分開始
int right=mid+1;
//右部分開始元素下標
可用於鍊錶排序
注意空間不能優化將此輔助陣列變為在遞迴中的引數即可。這樣的話,上面兩個**都要改變。
package algorithm;
public
class
merge
private
void
exch
(comparable[
] a,
int i,
int j)
public
void
sort
(comparable[
] a)
private
void
sort
(comparable[
] src, comparable[
] dst,
int lo,
int hi)}}
return;}
int mid=lo+
(hi-lo)/2
;sort
(dst,src,lo,mid)
;sort
(dst,src,mid+
1,hi);if
(less
(src[mid+1]
,src[mid]))
merge
(src,dst,lo,mid,hi);}
private
void
merge
(comparable[
] src,comparable[
] dst,
int lo,
int mid,
int hi)
}}
2019-4-23
分解:將待排序的n個元素分成n/2兩個子串行
解決:使用歸併排序遞迴的排序兩個子串行
合併:合併兩個已排序好的子串行來生成排序好的答案。
當待排序的序列長度為1時,遞迴回公升,因為這時長度為1的序列,已經排序好了。我們不需要任何操作。
這裡講一下具體操作:將要排序的一組數分成兩堆(這裡我們選取中間點為劃分標準),然後我們從兩堆中的第乙個元素比較,小的(或者大的,這裡要求我們是降序還是公升序排列)就放到乙個新開的陣列裡面,來儲存我們所需要的答案。
#includevoid merge(int *num,int p,int q,int r)
; int ab[50]=;
for(int i=0;i
am[n1]=0x3f3f3f3f;//作為結束的哨兵
for(int i=0;i
ab[n2]=0x3f3f3f3f;
int j=0;
int i=0;//分別是兩個待排序陣列的下標
for(int k=p;k<=r;k++)//從p到r,保證了所有元素都被排序
else
}}void merge_sort(int *num,int p,int r)
}int main(void)
;//15個
printf("排序前\n");
for(int j=0; j<=14; j++)
putchar('\n');
merge_sort(num,0,14);
printf("排序後\n");
for(int j=0; j<=14; j++)
putchar('\n');} `
歸併排序以及歸併排序的優化
1 歸併排序的實現 歸併排序也利用了分治法的思想,首先將序列分成左右兩部分,將左右兩部分分別排序,然後將有序的兩個子串行進行合併 即merge操作 程式是遞迴進行的,主函式實現如下 歸併排序主函式 void merge sort int a,int first,int last else while...
三種排序演算法 歸併排序 快速排序,堆排序
歸併排序 建立在歸併操作上的一種有效的排序演算法,該演算法是採用分治法 divide and conquer 的乙個非常典型的應用。將已有序的子串行合併,得到完全有序的序列 即先使每個子串行有序,再使子串行段間有序。若將兩個有序表合併成乙個有序表,稱為二路歸併。歸併排序演算法穩定,陣列需要o n 的...
O lgn 的三種排序,快速排序 歸併排序 堆排序
快速排序 取某個數作為中間數來進行比較,不斷的交換陣列中的兩個數,分成小於中間數和大於中間數的兩個分組,再對分組做快速排序 也就是用遞迴的思想 歸併排序 從中間把陣列分成兩部分,每部分都進行一次歸併排序 遞迴 然後再使用merge把這兩部分已排完序的陣列合併成順序陣列。堆排序 1 保持堆特性 左右兩...