12.1.1 什麼是歸併排序void selection(int *a, int left, int right)//
輸入陣列a,要排序的左端點left和右端點right215
16}17}
18 }
用下面一張圖能清晰的描述歸併排序
2.2.1 遞迴部分
void mergesort(int *a, int left, int right) //2.2.2 排序部分輸入陣列a,要排序的左端點left和右端點right
}
void merge(int *a, int left, int mid, int right)//輸入陣列a,要排序的左端點left和右端點right,中點mid
for (int i = 0; i < nr; i++)//
將陣列a右端的元素賦給右端陣列
al[nl] = inf;//
設定左端陣列的最後乙個元素為哨兵
ar[nr] = inf;//
設定右端陣列的最後乙個元素為哨兵
//將左端陣列和右端陣列的元素排序填入陣列a
int i = 0
;
int j = 0
;
for (int k = left; k < right + 1; k++)//
遍歷陣列a左端點left到右端點right+1,用於填入元素
else
//若左端陣列的元素大於右端陣列的元素,將右端陣列的第j個元素填入陣列a
/*若任意一端陣列元素到最後乙個,
該陣列的最後乙個元素哨兵將恆大於另一陣列最後乙個之前的元素
使另一陣列的元素陸續填入陣列a
*/}}
//我們用 mergetoselectionnum 來確定何時將歸併排序轉到選擇排序
void mergeselectionsort(int *a, int left, int right, int
mergetoselectionnum)
else
//否則,進行選擇排序}}
#include #define max 10000 //參考文獻 演算法導論_原書第3版陣列元素最大值
#define inf 2147483647 //
哨兵,不超過int範圍
void sort(int*, int, int);//
排序初始化
void mergeselectionsort(int*, int, int, int);//
歸併排序與選擇排序的組合
void merge(int*, int, int, int);//
歸併排序
void selection(int*, int, int);//
選擇排序
void pri(int*,int);//
輸出陣列
intmain()
void pri(int *a, int len)//
輸出
}void selection(int *a, int left, int right)//
輸入陣列a,要排序的左端點left和右端點right}}
}void merge(int *a, int left, int mid, int right)//
輸入陣列a,要排序的左端點left和右端點right,中點mid
for (int i = 0; i < nr; i++)//
將陣列a右端的元素賦給右端陣列
al[nl] = inf;//
設定左端陣列的最後乙個元素為哨兵
ar[nr] = inf;//
設定右端陣列的最後乙個元素為哨兵
//將左端陣列和右端陣列的元素排序填入陣列a
int i = 0
;
int j = 0
;
for (int k = left; k < right + 1; k++)//
遍歷陣列a左端點left到右端點right+1,用於填入元素
else
//若左端陣列的元素大於右端陣列的元素,將右端陣列的第j個元素填入陣列a
/*若任意一端陣列元素到最後乙個,
該陣列的最後乙個元素哨兵將恆大於另一陣列最後乙個之前的元素
使另一陣列的元素陸續填入陣列a
*/}}//
我們用 mergetoselectionnum 來確定何時將歸併排序轉到選擇排序
void mergeselectionsort(int *a, int left, int right, int
mergetoselectionnum)
else
//否則,進行選擇排序
}}void sort(int *a, int len,int
mergetoselectionnum)
排序 歸併排序
歸併 merge 排序法是將兩個 或兩個以上 有序表合併成乙個新的有序表,即把待排序序列分為若干個子串行,每個子串行是有序的。然後再把有序子串行合併為整體有序序列。歸併 將兩個已經排好序的集合合併到乙個集合眾,並且保證新的集合也是有序的。核心點 只有乙個元素的集合是已經排好序的集合。歸併排序是建立在...
排序 歸併排序
歸併 merge 排序法是將兩個 或兩個以上 有序表合併成乙個新的有序表,即把待排序序列分為若干個子串行,每個子串行是有序的。然後再把有序子串行合併為整體有序序列。該演算法是採用分治法 divide and conquer 的乙個非常典型的應用。2 路歸併演算法 1.演算法基本思路 設兩個有序的子檔...
排序 歸併排序
利用遞迴的思想,當n 1時,只有乙個元素需要排序,為遞迴臨界條件 否則,遞迴的將前半部分資料和後半部分資料各自歸併排序,得到排序後的兩部分資料,然後再將得到的兩部分合併到一起。mergesort algorithm public void mergesort int data mergesort例程...