歸併排序以及三種常見優化

2021-09-19 13:55:29 字數 3152 閱讀 8058

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 保持堆特性 左右兩...