歸併排序(重溫經典演算法系列)

2021-10-23 01:24:15 字數 2984 閱讀 5926

單個元素肯定有序;

歸併排序採用分治思想,分而治之:

將待排序陣列劃分為n等分,每份長度為1個元素,則 n份全部有序;

再一生二,二生四,逐步兩兩元素有序的區間,歸一合併成1個有序區間;

最終會歸併出整乙個陣列元素有序的結果.

歸併排序有兩種實現方式:

(1)自頂向下遞迴呼叫實現;

(2)自底向上迭代執行實現.

//左右雙閉區間[low,high];

//歸併過程;

template

<

typename t>

void

__merge

(t* arr, t* temparr,

const

int low,

const

int mid,

const

int high)

int i = low;

//左區間[low,mid]起點;

int j = mid +1;

//右區間[mid+1,high]起點;

//歸併過程,使用索引k記錄已排好序的最後元素位置;

for(

int k = low; k <= high;

++k)

else

if(j > high)

else

if(temparr[i]

<= temparr[j]

)else

輸出並理解中間過程;

//randomarrayfuntionhelper::printarray(arr, low, high+1);

//randomarrayfuntionhelper::printarray(temparr, low, high+1);

//std::cout << " ------\n";}}

//分治過程;

template

<

typename t>

void

__mergesort

(t* arr, t* temparr,

int low,

int high)

}else

}//遞迴呼叫(top-down);

template

<

typename t>

//void datasort::mergesorttd(t* arr, const std::size_t n)

**中間採用了小規模時,直接通過直接插入排序演算法實現優化;

插入排序(重溫經典演算法系列)

//過載直接插入排序;

template

<

typename t>

void

directinsertionsort

(t* arr,

const

int low,

const

int high)

//找到合適插入位置j,第二次迴圈提前終止;

if(j != i)

}}

關於歸併排序演算法的具體優化思想,可以參考文章:
歸併排序及其優化

需要使用標頭檔案:

#include

//歸併過程;

template

<

typename t>

void

__merge

(t* arr, t* temparr,

const

int low,

const

int mid,

const

int high)

int i = low;

//左區間[low,mid]起點;

int j = mid +1;

//右區間[mid+1,high]起點;

//歸併過程,使用索引k記錄已排好序的最後元素位置;

for(

int k = low; k <= high;

++k)

else

if(j > high)

else

if(temparr[i]

<= temparr[j]

)else

輸出並理解中間過程;

//randomarrayfuntionhelper::printarray(arr, low, high+1);

//randomarrayfuntionhelper::printarray(temparr, low, high+1);

//std::cout << " ------\n";}}

//歸併排序(自底向上迭代版)(bottom-up);

template

<

typename t>

//void datasort::mergesortbu(t* arr, const std::size_t n)

//第 i ( i = 0,1,2 …… )輪要歸併已分別各自有序的兩個陣列範圍是;

//arr[ index + i * sz, index + (i+1) * sz - 1];

//arr[ index + (i+1) * sz, index + (i+2) * sz - 1];

for(std::size_t sz = littlesize; sz < n; sz +

= sz)}}

delete

temparr;

}

歸併排序優化思想解說,可以參考:

歸併排序及其優化

歸併排序演算法的動畫過程演示,可以參考:

排序演算法過程演示

交流方式

氣泡排序(重溫經典演算法系列)

單個元素時肯定是有序的 故首元素單獨有序,從 1,n 為待排元素所在的區間 i 控制 n 1輪冒泡 即執行一系列兩兩元素對比的操作 第 i 輪能夠選出第 i 大 或者小 的元素值,n 1輪 選出 n 1 個較大 或者小 值之後,整個序列即可有序 for int i 1 i n i 外層i 控制 n ...

希爾排序(重溫經典演算法系列)

參考材料 希爾排序,又名縮小增量排序 它是一種改進版本的直接插入排序法 只不過直接插入排序是從左往右遍歷選擇帶插入的元素,再自右向左找到合適的插入位置 而希爾排序是通過對原陣列進行分組,進而產生小規模的區域性有序的陣列,接著再直接插入排序演算法實現高效排序的一種排序演算法.本質是 直接插入排序高效處...

排序演算法系列之歸併排序

public class mergesort if index1 middle while index2 high else while index1 middle 將temp low high 序列複製到原序列 system.arraycopy temp,low,array,low,high 1 ...