單個元素肯定有序;
歸併排序採用分治思想,分而治之:
將待排序陣列劃分為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 ...